Типы повторного использования WCF в блоках, на которые ссылаются, не снова используют Интерфейс ServiceContract

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

  • MyUserControl - Нуждается в ссылке на сервисную реализацию IMyService

  • MyService - Реализации IMyService

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

  • MyWebApp

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

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

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

12
задан FishBasketGordo 3 December 2012 в 13:59
поделиться

2 ответа

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

В клиентском приложении укажите сборку MySharedInterfaces . Затем создайте экземпляр ChannelFactory для интерфейса службы:

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

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

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

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

IMyService client = factory.CreateChannel();

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

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

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

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

16
ответ дан 2 December 2019 в 18:18
поделиться

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

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

4
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: