Возврат интерфейса из службы WCF
-
08-07-2019 - |
Вопрос
У меня есть некоторый код удаленного взаимодействия .NET, где фабричный метод, реализованный в некотором серверном классе, возвращает интерфейсы для конкретных объектов, также выполняющихся на том же сервере. Удаленное взаимодействие .NET автоматически создает прокси и позволяет передавать интерфейсы клиенту, который затем может вызывать их напрямую.
Примеры интерфейсов:
public interface IFactory
{
IFoo GetFoo();
}
public interface IFoo
{
void DoSomething();
}
Пример кода клиента:
...
IFactory factory = (IFactory) System.Activator.GetObject (typeof (IFactory), url);
...
IFoo foo = factory.GetFoo (); // the server returns an interface; we get a proxy to it
foo.DoSomething ();
...
Все это прекрасно работает. Однако сейчас я пытаюсь перенести мой код в WCF. Интересно, есть ли способ обойти интерфейсы и заставить WCF генерировать прокси на лету на клиенте, как это делает оригинальное удаленное взаимодействие .NET.
И я не хочу возвращать экземпляры классов, поскольку я не хочу показывать реальные классы. И сериализация полного экземпляра и отправка его назад и вперед между сервером и клиентом также не вариант. Я действительно хочу, чтобы клиент общался с объектом сервера через указатель интерфейса / прокси.
Есть идеи?
Другие советы
Извини, Джезелл, я не понимаю.
Да, я могу использовать ChannelFactory
на клиенте, чтобы создать прокси для IFactory
, так как этот одноэлементный объект был " опубликован " сервером через URI в ServiceHost
.
Но мои экземпляры IFoo
на сервере не были связаны ни с одним ServiceHost
; Я просто хочу получить их обратно, вызвав мой прокси-сервер IFactory
на клиенте, и позволить WCF выполнить вызов к серверу IFactory
, который предоставит некоторый IFoo
, который затем будет перенаправлен обратно клиенту и обернут в динамически сгенерированный прокси. Я действительно просто хочу иметь возможность писать factory.GetFoo ();
на моем клиенте ...
Тем временем Брайан указал мне на очень интересный документ, который я пропустил на MSDN, в котором объясняется, как имитировать маршалинг интерфейса .NET Remoting с использованием сеансов и EndPointAddress10
и ... как вы написал ChannelFactory
, чтобы получить прокси на стороне клиента.
Итак, теперь я знаю, как реплицировать мой код удаленного взаимодействия .NET, но за него приходится платить довольно высокую цену. Сложность кода, связанная с WCF, немного выше, чем с простым старым решением удаленного взаимодействия .NET.
Класс ChannelFactory делает именно это, динамически генерирует прокси во время выполнения при наличии интерфейса.