Повторное использование типов WCF в ссылочных сборках не использует интерфейс ServiceContract - PullRequest
12 голосов
/ 22 марта 2010

У меня есть четыре отдельных проекта:

  • MyUserControl - Требуется ссылка на службу, реализующую IMyService

  • MyService - Инструменты IMyService

  • MySharedInterfaces - Содержит IMyUserControl и IMyService

  • MyWebApp

Пользовательский элемент управления должен динамически загружаться во время выполнения. Это реализует IMyUserControl и имеет свойство типа IMyService, которое будет установлено во время выполнения.

Проблема даже в возможности повторного использования типов, MyWebApp не использует интерфейс IMyService. Он всегда генерирует его снова из справочника услуг. Это не было бы проблемой, если бы я мог привести его к MySharedInterfaces.IMyService, что я не могу понять, так как оно должно быть точно таким же.

Пользовательский элемент управления ожидает что-то типа IMyService. Можно ли в любом случае либо привести WebServiceReference.IMyService обратно к MySharedInterface.IMyService, либо заставить WebServiceReference повторно использовать MySharedInterface.IMyService?

Ответы [ 2 ]

16 голосов
/ 22 марта 2010

Мэтт, вы определенно могли бы самостоятельно выполнить «двухэтапный» процесс создания прокси на стороне клиента - это действительно не важная вещь.

В вашем клиентском приложении см. Сборку MySharedInterfaces.Затем создайте экземпляр ChannelFactory<T> для вашего интерфейса сервиса:

ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>();

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

Это довольно затратный по времени и ресурсам шаг, поэтомуесли возможно, попробуйте где-нибудь спрятать фабрику и использовать ее, вместо того, чтобы постоянно создавать заново.

Учитывая вашу фабрику каналов, теперь вы можете создавать свои действительные каналы связи, которые в основном эквивалентны вашему прокси-клиенту, которыйгенерируется Add Service Reference:

IMyService client = factory.CreateChannel();

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

client также реализует интерфейс ICommunicationObject, поэтому, если вам нужно проверить что-то, связанное с WCF, например, состояние канала, вы можете привести своего клиента:

CommunicationState currentState = ((ICommunicationObject)client).State;

на самом деле есть все кусочки вашего сгенерированного клиентского прокси-класса, но у вас больше контроля над тем, что вы делаете.

4 голосов
/ 22 марта 2010

Включили ли вы ссылку на MySharedInterfaces в MyUserControl?Есть ли в MySharedInterfaces какие-либо ссылки на другие сборки, на которые нет ссылок в MyUserControl?

Сложный путь - не использовать сгенерированную ссылку на службу и использовать ChannelFactory.Это всегда дает вам интерфейс от MySharedInterfaces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...