在WCF服务中创建私有数据成员是一个好主意,如果这是一个好习惯,那么当我们初始化这些成员变量时,因为客户端只调用服务的方法。
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
如果您对互操作性感兴趣,我不认为这通常是一种好的做法。
首先创建一个合同(操作合同,消息合同,数据合同等),以明确的方式指定支持什么和不支持什么。它公开明确地指明了这些事情。当你开始宣布私人成员参与公共合同时,它会非常迅速地混乱。对于追随你的程序员来说,识别正在发生的事情会成为问题。
您可能正在尝试将逻辑封装在数据协定中,这不是数据协定的目的。正如@CodeCaster所建议的那样,这种操作应该在数据协定类之外执行。即使是构造函数填充默认值等简单的事情也可能会出现问题。这种逻辑也应该在DataContract类之外执行。
此外,当您声明私有成员为[DataMember]
时,您依赖于数据协定序列化程序的非标准实现细节 - 它可以读取/写入非公开成员 - 即DataConstractSerializer(至少在.NET平台上)可以执行您自己的代码中无法执行的操作。你依赖'魔术'。虽然这种“神奇”有助于DataConstractSerializer提供惊人的性能,但我认为您不应该依赖于它的实现细节。例如,您会发现无法与Silverlight应用程序共享此类DataContract类,因为在该平台上,DataConstractSerializer无法读取/写入非公共成员。
然而,像所有'做法'一样,你必须考虑你的情况。如果不要求互操作性和可维护性,那么上述大部分内容都不相关,可以忽略不计。 :)