引用程序集中的WCF重用类型不会重用ServiceContract接口

时间:2010-03-22 14:49:04

标签: interface wcf

我有四个独立的项目:

  • MyUserControl - 需要对实施IMyService的服务的引用

  • MyService - 实施IMyService

  • MySharedInterfaces - 包含IMyUserControlIMyService

  • MyWebApp

用户控件需要在运行时动态加载。这实现了IMyUserControl,并且具有类型为IMyService的属性,该属性将在运行时设置。

即使使用重用类型的选项,问题仍然存在,MyWebApp没有重用IMyService接口。它总是从服务参考中再次生成它。如果我可以把它投射到我无法理解的MySharedInterfaces.IMyService,这不会是一个问题,因为它应该完全相同。

用户控件期望类型IMyService。无论如何要么将WebServiceReference.IMyService强制转换为MySharedInterface.IMyService,要么强制WebServiceReference重新使用MySharedInterface.IMyService

2 个答案:

答案 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的界面。