0

当您创建一个新的 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; }
    }
}

拥有这些私有字段boolValuename有什么意义?在合同中编写一些数据清理或其他一些操作是否是一种好习惯,从而使其膨胀?这似乎是我不直接写入字段的唯一合理原因。那么它是一个过时的软件还是它背后有一些原因?

4

3 回答 3

2

在我看来,DataContracts 的唯一目的应该是在域之间传输数据。验证/清理逻辑应该不在 DataContract 的职责范围内。特别是如果目的是在多个项目/平台中共享/链接代码文件以供重用。

这也意味着您不应该在应用程序的其他地方使用您的 DataContract 对象。它应该通过某种适配器或转换器来读取/写入内容到您的应用程序特定对象。它在那个转换(或您的应用程序对象)中,您可以在其中进行一些验证。数据传输层越简单越好。

有可能的是,您可以在 setter/getter 中添加日志记录/调试代码(最好是临时的),以根据需要跟踪数据输入/输出。到目前为止,这是我唯一觉得可以在 DataContract 对象中放置除简单属性之外的任何内容的情况同样,我只是暂时这样做)。

编辑:至于为什么这是默认生成的文件,我不确定。我的 DataContract 对象始终使用自动属性。我建议这可能是在引入自动属性之前对 .NET 2.0 的回归,但无论如何直到 3.0 才引入 WCF/DataContracts。

于 2012-06-21T21:49:08.460 回答
1

与您曾经为任何私有值编写 getter 和 setter 的原因相同,以帮助封装并允许您操纵类的内部工作,而不必担心外部成员会破坏,因为它们直接操纵变量。

于 2012-06-21T21:15:58.030 回答
1

简短的回答是,公共属性允许您(设计者)在将值分配给您的私有字段之前对其进行限制,从而可能使您免于处理意外数据。尽管大多数 get 和 set 方法是相同的,但它们通常是抵御不良数据的第一道防线。

于 2012-06-21T21:24:49.470 回答