创建新的WCF项目时,会为您生成示例服务。默认数据合同是(我刚刚更改了字符串类型字段标题):
[DataContract]
public class CompositeType
{
bool boolValue = true;
string name = "";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
}
拥有私人字段 boolValue 和名称的重点是什么?在合同中编写一些数据清理或其他操作是一种好的做法,因此膨胀吗?这似乎是我不直接写字段的唯一理由。那么它是一个英国媒体报道,还是背后有一些原因呢?
答案 0 :(得分:2)
在我看来,DataContracts的唯一目的应该是在域之间传输数据。验证/清理逻辑应该超出DataContract的职责范围。特别是如果目的是在多个项目/平台中共享/链接代码文件以供重用。
这也意味着您不应该在应用程序的其他位置使用DataContract对象。它应该通过某种适配器或转换器来读取/写入特定于应用程序的对象的内容。它在转换(或您的应用程序对象)中可以进行一些验证。数据传输层越简单越好。
通常,您可以在setter / getters中添加日志/调试代码(最好是临时的)以根据需要跟踪数据输入/输出。到目前为止,这是唯一一个我认为可以在DataContract对象中放置任何而不是简单属性的情况(再次,我只是暂时这样做)。
编辑:至于为什么这是默认生成的文件,我不确定。我的DataContract对象始终使用自动属性。我建议在引入自动属性之前这可能是对.NET 2.0的回归,但无论如何都不会引入WCF / DataContracts。
答案 1 :(得分:1)
您为任何私有值编写getter和setter的原因相同,有助于帮助封装并允许您操纵类的内部工作,而不必担心外部成员因为直接操作变量而破坏。
答案 2 :(得分:1)
简短的回答是,公共属性允许您(设计人员)在将值分配给您的私有字段之前限制它们,从而可能使您无法处理意外数据。虽然大多数get和set方法都是相同的,但它们通常是防止坏数据的第一道防线。