У меня есть четыре отдельных проекта:
MyUserControl - Нуждается в ссылке на сервисную реализацию IMyService
MyService - Реализации IMyService
MySharedInterfaces - Содержит IMyUserControl
и IMyService
MyWebApp
Пользовательский элемент управления должен быть динамично загружен во времени выполнения. Это реализует IMyUserControl
и имеет свойство типа IMyService
который будет установлен во времени выполнения.
Проблема даже с опцией снова использовать типы, MyWebApp не снова использует IMyService
интерфейс. Это всегда генерирует его снова из Сервисной Ссылки. Это не было бы проблемой, если я мог бы бросить ее к MySharedInterfaces.IMyService
, который я не могу понять, так как это должно быть точно то же.
Пользовательский элемент управления ожидает что-то вроде типа IMyService
. Должен туда так или иначе или бросить WebServiceReference.IMyService
назад к MySharedInterface.IMyService
или сила WebServiceReference
к повторному использованию MySharedInterface.IMyService
?
Мэтт, вы определенно могли бы самостоятельно выполнить «двухэтапный» процесс создания прокси на стороне клиента - это действительно не так уж важно.
В клиентском приложении укажите сборку MySharedInterfaces
. Затем создайте экземпляр ChannelFactory
для интерфейса службы:
ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>();
Это в основном создает фабричный класс, который затем способен создавать фактические каналы связи между вашим клиентом и вашим сервером. Поскольку для этого требуется контракт службы, этот метод работает только в том случае, если вы можете поделиться сборкой контракта службы (что вы можете и хотите в вашем случае).
Это довольно затратный по времени и ресурсам шаг, поэтому, если когда-либо возможно, попробуйте спрятать фабрику где-нибудь и повторно использовать ее вместо того, чтобы постоянно ее воссоздавать.
Учитывая фабрику каналов, теперь вы можете создать свои фактические каналы связи, которые в основном эквивалентны вашему прокси-клиенту, который создается с помощью Добавить ссылку на службу
:
IMyService client = factory.CreateChannel();
Это не очень дорогая операция, чтобы вы могли делать это каждый раз перед обращением в службу поддержки, не беспокоясь о неисправных каналах и т. д.
Клиент
также реализует интерфейс ICommunicationObject
, поэтому, если вам нужно проверить что-то связанное с WCF, например состояние канала, вы можете передать своего клиента:
CommunicationState currentState = ((ICommunicationObject)client).State;
Итак у вас в основном действительно есть все части вашего сгенерированного прокси-класса клиента, но у вас больше контроля над тем, что вы делаете.
Включили ли вы ссылку на MySharedInterfaces в MyUserControl? Есть ли у MySharedInterfaces какие-либо ссылки на другие сборки, на которые нет ссылок в MyUserControl?
Жесткий способ - не использовать сгенерированную ссылку на службу и использовать ChannelFactory. Это всегда дает вам интерфейс из MySharedInterfaces.