.net 如何*正确*使用WCF接口类型?

.net 如何*正确*使用WCF接口类型?,.net,wcf,interface,.net,Wcf,Interface,更具体地说,问题是: 如何使用在属性签名中具有(必须具有)接口类型的WCF序列化类,因为它实现了接口 这是一个设计问题。我不是在找黑客。 其目的是将接口定义与实现类分开,因此不允许接口引用实现类 我知道我们不应该通过WCF和 还有(不可互操作的)方法(如使用NetDataContractSerializer或ServiceKnownType属性),但这给我留下了一个问题:有没有合适的方法使用基于WCF接口的类,或者根本不应该尝试这种方法?序列化基本上是关于传输数据的。接口是关于描述行为的。从根本

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

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

我知道我们不应该通过WCF和
还有(不可互操作的)方法(如使用NetDataContractSerializer或ServiceKnownType属性),但这给我留下了一个问题:有没有合适的方法使用基于WCF接口的类,或者根本不应该尝试这种方法?

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

您可以使用
[KnownType(…)]
-如果您在每一端使用相同的确切类型(程序集共享),这肯定会有所帮助,但这是非常不可移植的

如果您希望使用惯用的WCF来实现可移植性,那么您可能应该将自己限制在简单的数据契约上,这可能对只知道WSDL的客户机有用


也就是说,当WCF适合我的时候,我会毫不犹豫地折磨和滥用WCF来达到我自己的目的;p

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

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

例如:

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

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

我不太明白。您可以将DataContract和DataMember属性放在从接口继承的类上。Marc,我知道您提到的那些事情。但我的问题仍然是:如何解决这个设计问题?不再使用界面将是一个很大的牺牲。@Peladao在你的应用程序中使用界面:好。但通过电线,它们没有任何意义。如果您想为此进行设计,那么就有一个单独的DTO层,没有任何功能(除了自动道具),只有数据。这就是最终你在电线上得到的。对,我刚刚开始担心我必须创建一个完整的额外层。然而,对于我在某些类中遇到的特定问题,我找到了一个更简单的解决方案。看看我自己的答案。在那个例子中,我看不出接口能达到什么目的。。。但从更广泛的经济背景来看,这大概是有道理的app@Marc你完全正确。接口的必要性是更广泛方案的一部分,此处未具体说明,但被视为必要条件。(我想通常是这样)。如果应用程序在部分受信任的域中运行,则将私有字段设置为DataMember将引发SecurityException。@JDStuart是的,我知道。可以通过使用内部字段而不是专用字段,并在assemblyinfo.cs中将定义数据协定的程序集标记为[assembly:InternalsVisibleTo(“System.Runtime.Serialization”)]来克服这一问题。请参阅此链接: