【问题标题】:WCF reuse types in referenced assemblies does not reuse the ServiceContract Interface引用程序集中的 WCF 重用类型不重用 ServiceContract 接口
【发布时间】:2011-01-30 09:21:19
【问题描述】:

我有四个独立的项目:

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

  • MyService - 实现 IMyService

  • MySharedInterfaces - 包含 IMyUserControlIMyService

  • MyWebApp

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

问题在于即使选择重用类型,MyWebApp 也没有重用IMyService 接口。它总是从服务参考中再次生成它。如果我可以将其转换为 MySharedInterfaces.IMyService,这将不是问题,我无法理解,因为它应该完全相同。

用户控件需要IMyService 类型的东西。无论如何要将WebServiceReference.IMyService 转换回MySharedInterface.IMyService 或强制WebServiceReference 重用MySharedInterface.IMyService

【问题讨论】:

标签: interface wcf


【解决方案1】:

Matt,您绝对可以自己完成创建客户端代理的“两步”过程 - 这真的不是什么大问题。

在您的客户端应用程序中,引用 MySharedInterfaces 程序集。然后,为您的服务接口创建一个ChannelFactory<T> 的实例:

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

这基本上创建了一个工厂类,然后能够在您的客户端和服务器之间创建实际的通信通道。由于它需要服务合同,因此此方法仅在您可以共享服务合同程序集(在您的情况下您可以并且想要)时才有效。

这是一个相当耗费时间和资源的步骤,因此,如果可能,请尝试将工厂存放在某个地方并重复使用,而不是不断地重新创建它。

鉴于您的频道工厂,您现在可以创建实际的通信频道,这基本上相当于您的代理客户端,由Add Service Reference 生成:

IMyService client = factory.CreateChannel();

这不是一个非常昂贵的操作,因此您可以在每次调用服务之前都这样做,而不必担心通道故障等。

client 也实现了ICommunicationObject 接口,因此如果您需要检查与 WCF 相关的内容,例如通道的状态,您可以强制转换您的客户端:

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

因此,您基本上确实拥有生成的客户端代理类的所有点点滴滴,但您可以更好地控制自己在做什么。

【讨论】:

    【解决方案2】:

    您是否在 MyUserControl 中包含了对 MySharedInterfaces 的引用? MySharedInterfaces 是否有对 MyUserControl 中未引用的其他程序集的任何引用?

    困难的方法是不使用生成的服务引用并使用 ChannelFactory。这始终为您提供来自 MySharedInterfaces 的接口。

    【讨论】:

    • 感谢您的快速回复。 MyUserControl 项目引用了 MySharedInterfaces,MySharedInterfaces 没有引用 MyUserControl 未引用的任何内容。目前它只是一个概念证明,所以它现在很空。上周是我第一次看 WCF,所以希望坚持从简单的东西开始。不过,我会阅读 ChannelFactory。只是出于好奇,为什么它不能重用 IMyServiceInterface ,而它可以重用其他所有内容?
    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2014-10-20
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多