【问题标题】:How to *properly* use interface types with WCF?如何*正确*使用 WCF 的接口类型?
【发布时间】:2011-09-04 02:36:01
【问题描述】:

更具体地说,问题是: 如何使用 WCF 序列化在属性签名中具有(必须具有)接口类型的类,因为它实现了一个接口?

这是一个设计问题。我不是在寻找黑客。 目的是保持接口定义与实现类分开,因此不让接口引用实现类。

我知道我们不应该通过 WCF 传递接口和 还有(不可互操作的)方法可以做到这一点(例如使用 NetDataContractSerializer 或 ServiceKnownType 属性),但这给我留下了一个问题:是否有适当的方法来使用基于 WCF 接口的类,或者这不应该是有没有尝试过?

【问题讨论】:

  • 我不确定我是否理解。您可以将 DataContract 和 DataMember 属性放在从接口继承的类上。

标签: .net wcf interface


【解决方案1】:

序列化基本上是关于传输数据。接口是关于描述行为的。从根本上说,这两件事是完全正交的,IMO。

您可以可能使其与[KnownType(...)] 一起使用 - 如果您在每一端使用相同的确切类型(程序集共享)肯定会有所帮助,但这非常不便携。

如果您追求惯用的 WCF 用法以实现可移植性,您可能应该将自己限制在简单的数据协定中,这有可能对只知道 WSDL 的客户有用。

也就是说,当 WCF 适合我的时候,我毫不犹豫地折磨和滥用 WCF ;p

【讨论】:

  • 马克,我知道你提到的那些事情。但我的问题仍然存在:我该如何解决这个 design 问题?只是不再使用接口将是一个很大的牺牲。
  • @Peladao 在您的应用程序中使用接口:很好。但是在电线上它们没有任何意义。如果您想为此设计,那么就拥有一个单独的DTO 层,该层没有功能(可能除了自动道具)——只有数据。也就是说,最终,你会得到什么。
  • 对,我刚刚开始担心我必须创建一个额外的图层。但是,对于某些课程遇到的特定问题,我找到了一个更简单的解决方案。请参阅我自己的答案。
【解决方案2】:

我找到了解决我自己特定问题的方法。

问题是我将(接口类型的)属性标记为 DataMember。通过将相应的私有成员标记为 DataMember(并确保它们的类型是具体的类),问题就得到了解决。

例子:

[DataContract()]
public class Company : ICompany
{
    [DataMember(Name = "Employees")]
    private EmployeeList _employees;

    public IEmployeeList Employees { get { return _employees; }}
}

【讨论】:

  • 在那个例子中,我看不出界面的目的是什么......但大概它在应用程序的更广泛背景下是有意义的
  • @Marc 你说得对。接口的必要性是更广泛方案的一部分,这里没有具体解释,但被认为是必要条件。 (我想它经常是)。
  • 如果应用程序在部分受信任的域中运行,将私有字段设置为 DataMember 将引发 SecurityException。
  • @JDStuart 是的,我知道。这可以通过使用内部字段而不是私有字段并在 assemblyinfo.cs 中使用 [assembly: InternalsVisibleTo("System.Runtime.Serialization")] 标记定义数据协定的程序集来克服。见此链接:blog.walteralmeida.com/2010/05/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多