2009-03-12 1 views
0

Я пытаюсь передать объект в веб-службу WCF, объект, который я передаю, является объектом Server, тогда я хочу иметь возможность вызвать TestConnection();WCF и Object

Проблема, которую я имею, что сервер является базовым классом, и есть несколько производных классов сервера, т.е. SqlServer2005Server, OracleServer и ODBCServer, которые я хочу использовать

Я хочу, чтобы иметь возможность передавать в сервере Объект, а затем определить его тип, брось, а затем использовать метод

public string TestServerConnection(Server server) 
{ 
    if (server.ConnectionType == "SqlServer") 
    { 
     SqlServer2005Server x = (SqlServer2005Server)server; 
     // Tests connection to server and returns result 
     return x.TestConnection(); 
    } 

    return ""; 
} 

«Сервер» базовый класс реализует IServer

Я не могу бросить его, вы можете посоветовать?

Много Оценил

Phill

ответ

1

Вы должны добавить объявление KnownType к вашему договору обслуживания для каждого производного класса. Есть способы автоматизировать это (поскольку он, очевидно, свертывает наследование кода и разрывов), но они требуют большой работы.

1

Связанный объект представляет собой «живое» соединение с СУБД? Если да, то нет надежды на то, что это когда-либо будет работать. Имейте в виду, что, несмотря на симпатичную оболочку, единственное, что получает ваш веб-сервис от вызывающего, - это кусок xml.

2

Как Daniel Pratt said, в конце концов, вы всего лишь перетаскиваете XML (не всегда в случае, но большую часть времени) через провод.

Если вы использовали генератор прокси для генерации определения типа сервера, то вы не сможете совершать вызовы методов сервера, потому что в прокси используются только свойства (по меньшей мере семантически) определение. Кроме того, вы не можете использовать производные типы, потому что ваш экземпляр действительно является отдельным определением типа, а не фактической базой.

Если тип сервера действительно того же типа (и тем же, я имею в виду ссылку на ту же сборку, а не только на имя и схему), то вы можете сделать то, что Steve said, и использовать атрибут KnownType на сервере определение, добавив один атрибут для каждого производного класса.

Однако, как он сказал, это свергает ваш код, поэтому будьте осторожны при этом.

Я думал, что использование инверсии управления будет работать здесь, но вы столкнетесь с той же ситуацией с общими ссылками на конкретные поставщики.