DTO的.属性还是字段?

Gaz*_*yer 7 c# wcf soa dto

我需要创建一些DTO类来跨WCF传输业务对象.

由于这些只是没有功能的数据包,有什么理由我不能只使用字段,还是有一些很好的理由将它们作为属性正确地公开?

//fields
[DataContract]
class CustomerDTO
{
    [DataMember] public int     Id;
    [DataMember] public string  Name;
}

//or properties?
[DataContract]
class CustomerDTO
{
    [DataMember] public int    Id               { get; set; }
    [DataMember] public string Name             { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 17

如果可以的话,我最喜欢具有只读字段的不可变 DTO:

public class CustomerDTO
{
    public CustomerDTO(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public readonly int     Id;
    public readonly string  Name;

    // Override Equals and GetHashCode as well...
}
Run Code Online (Sandbox Code Playgroud)

不可变记录有很多优点,例如结构相等,这使得自动化测试断言的编写更加简单。它还免除了编写和维护单独的测试数据生成器的需要

不过,这取决于序列化程序。JSON.NET 可以处理不可变记录,但许多其他序列化程序不能。

对于那些处理公共字段的人,我更喜欢字段而不是属性,只是因为它更诚实;自动实现的读/写属性不提供封装

一些序列化器坚持公共属性,并且不序列化字段。如果是这种情况,你就必须这样做。

老实说,考虑到我在这方面投入了多少心思,这并不是让我彻夜难眠的事情,因为最终,在边界上,应用程序不是面向对象的。因此,OOD 的规则无论如何都不适用于 DTO。


Hen*_*man 6

由于这些只是没有功能的数据包,有什么理由我不能只使用字段

这里没有反对公共领域的有力论据。但是要意识到这只是因为 DTO 内部没有逻辑(行为),所以封装的正常论点不成立。

我仍然更喜欢属性,但在这里它们并不是必需的。