DTO/POCO 是否应该在所有属性上都有构造函数和私有 setter?

gcb*_*fln 6 c# design-patterns class poco dto

我知道这里有很多关于 DTO 和 POCO 的讨论,但我真的找不到关于这个的讨论。是否有关于在没有构造函数与私有 setter 和构造函数的情况下编写 DTO 的规则?

示例 A:

public class Person
{
    public int Id { get; set; }
    public String Name { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

示例 B:

public class Person
{
    public Person (int id, String name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
     }

    public int Id { get; }
    public String Name { get; }
    public int Age { get; }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法中的任何一种都被认为是反模式吗?为什么?我的意思是,我知道有人可能会支持不变性或锅炉拼盘和重构问题,但是有没有一种事实上的方法,官方的东西?

Ale*_*hev 6

DTO 不应该是不可变的,因为主要目的是可序列化和反序列化。所以不变性并不重要。

  1. 您需要将 DTO 标记为 DTO... 例如添加后缀 DTO (PersonDTO)
  2. 您必须确保不在任何逻辑中使用 DTO。收到 DTO 后应转换为 Domain 对象

可变亲

  • 易于施工
  • 易于序列化

可变的缺点

  • 可以错误地更改...

不变的亲

  • 不能误改...

不可变的缺点

  • 有时难以构建
  • 序列化程序可能有问题


Coo*_*eze 5

示例 B 更好,因为它是不可变的。DTO 的目的是传输数据,因此无需更改数据。