2012-02-20 67 views

回答

1

仅将数据合约用作DTO,并将其扩展到处理数据的代码中。

事情是这样的:

[DataContract] 
public class WCFDataClass 
{ 
    [DataMember] 
    public String Foo { get; set; } 
} 

// Your class, used for internal processing 
class MyWCFDataClass : WCFDataClass 
{ 
    public String MyFoo { get; set; } 

    public String DoFoo() 
    { 
     return this.Foo + this.MyFoo; 
    } 
} 
0

如果您有任何的互操作性的兴趣,我相信dont't它一般是一个很好的做法。

首先创建合同(操作合同,消息合同,数据合同等),以明确的方式指定哪些是支持的,哪些不支持。它明确地公开指定这些事情。当你开始宣布私人成员参与公共合同时,很快就会变得非常混乱。程序员在你发现后面的事情之后会产生问题。

您可能试图将逻辑封装在数据合同中,这不是数据合同的目的。正如@CodeCaster所建议的那样,这种操作应该在数据契约类之外进行。即使简单的事情,如构造函数填充默认值可能会有问题。这种逻辑也应该在DataContract类之外执行。

此外,当您声明私有成员为[DataMember]时,您依赖于数据协定序列化程序的非标准实现细节 - 事实上它可以读取/写入不是公有的成员 - 即DataConstractSerializer(至少在.NET平台上)可以做你在自己的代码中无法做到的事情。你依靠'魔术'。虽然这个'魔术'有助于DataConstractSerializer提供惊人的性能,但我认为您不应该依赖于它的实现细节。例如,您会发现DataContract类无法与Silverlight应用程序共享,因为在该平台上,DataConstractSerializer无法读取/写入非公共成员。

然而,就像所有'惯例'一样,你必须考虑你的情况。如果互操作性和可维护性不是要求,则上述大部分内容不相关,可以忽略。 :)