【问题标题】:WCF and interfaces on data contractsWCF 和数据契约上的接口
【发布时间】:2011-01-18 05:19:50
【问题描述】:

在使用 svcutil 创建 WCF 代理时,是否可以同时包含数据协定继承的接口,例如:

public class SomeType: ISometype
{
   public string Name { get; set; }
}

public interface ISometype
{
   public string Name { get; set; }
}

当我使用它创建代理时,在客户端创建了 SomeType 类型,但没有创建接口,也没有继承。我尝试将接口标记为 DataContract,但不允许使用该属性。

有可能做我想做的事吗?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    WCF 使用序列化消息传递,并且所有这些消息都需要能够使用 DataContractSerializer 或 XmlSerializer 进行序列化。而那些在客户端和服务器之间传递的消息需要在 XML 模式中表达。

    现在,XML 模式对接口一无所知——它完全是关于具体的、实际的类型。对于您的客户端可以是任何东西的常规场景,从 .NET 到 PHP 再到 Ruby 再到(无论如何),您需要确保以可以在 XML 模式中表示的方式表达您想要在客户端和服务器之间发送的所有内容 - 接口不能。所以在通用场景中确实没有办法支持这一点。

    如果您要控制电线的两端,例如您同时编写客户端和服务器,并且都在 .NET 中,那么您可以这样做:

    • 将您的 DataContracts(以及您的 ServiceContracts 和 OperationContracts 和 FaultContracts)全部放入一个单独的 MyServiceContracts 程序集

    • 从您的服务端代码和客户端引用该程序集。在这种情况下,当您开始创建客户端代理时,您提到的那些类型已经存在,WCF 将很高兴地重用该程序集中的这些类型。由于这是您引用的 .NET 程序集,因此您可以在其中包含 .NET 支持的任何内容 - 包括接口。

    【讨论】:

    • 谢谢 marc_s 我会试试这个方法。
    • 感谢 marc_s 的解释,我认为 ganeshran 正在考虑与我自己类似的情况。目标不是通过服务方法将实现 ISometype 的 foo 实例传递给服务器,我想做的是避免服务使用者中的具体依赖关系;无需复制另一层中的所有对象并拥有无穷无尽的映射(自动映射器或其他),我使用的服务具有数百种类型和数千种属性。
    【解决方案2】:

    您可以从实现ISometype 的类继承并使用 KnownType 属性将其添加到序列化中:

    Can I force svcutil.exe to generate data contracts for a WCF service?

    【讨论】:

    • 感谢 Artem,但我的兴趣是让生成的类型也实现 ISomeType 接口。我认为 KnownTypes 不会提供该功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多