我有四个独立的项目:
MyUserControl - 需要对实施IMyService
的服务的引用
MyService - 实施IMyService
MySharedInterfaces - 包含IMyUserControl
和IMyService
MyWebApp
用户控件需要在运行时动态加载。这实现了IMyUserControl
,并且具有类型为IMyService
的属性,该属性将在运行时设置。
即使使用重用类型的选项,问题仍然存在,MyWebApp没有重用IMyService
接口。它总是从服务参考中再次生成它。如果我可以把它投射到我无法理解的MySharedInterfaces.IMyService
,这不会是一个问题,因为它应该完全相同。
用户控件期望类型IMyService
。无论如何要么将WebServiceReference.IMyService
强制转换为MySharedInterface.IMyService
,要么强制WebServiceReference
重新使用MySharedInterface.IMyService
?
答案 0 :(得分:16)
在您的客户端应用中,引用MySharedInterfaces
程序集。然后,为您的服务接口创建ChannelFactory<T>
的实例:
ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>();
这基本上创建了一个工厂类,然后能够在客户端和服务器之间创建实际的通信通道。由于它需要服务合同,因此只有在您可以共享服务合同程序集时才能使用此方法(在您的情况下,您可以这样做)。
这是一个相当耗费时间和资源的步骤,所以如果可能的话,尝试将工厂存放在某处并重新使用它,而不是不断重新创建它。
鉴于您的频道工厂,您现在可以创建实际的沟通渠道,这基本上等同于Add Service Reference
生成的代理客户端:
IMyService client = factory.CreateChannel();
这不是一项非常昂贵的操作,因此您可以在拨打服务电话之前每次都这样做,而不用担心出现故障等等。
client
也实现了ICommunicationObject
接口,因此如果您需要检查与WCF相关的内容,例如频道的状态,您可以投射您的客户端:
CommunicationState currentState = ((ICommunicationObject)client).State;
所以你基本上已经掌握了生成的客户端代理类的所有部分内容,但是你可以更好地控制你正在做的事情。
答案 1 :(得分:4)
您是否在MyUserControl中包含对MySharedInterfaces的引用? MySharedInterfaces是否具有对MyUserControl中未引用的其他程序集的任何引用?
困难的方法是不使用生成的服务引用并使用ChannelFactory。这为您提供了MySharedInterfaces的界面。