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

时间:2018-06-13 13:15:43

标签: c# class design-patterns 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; }
}

例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; }
}

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

2 个答案:

答案 0 :(得分:1)

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

但是

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

可变亲

  • 易于构建
  • 易于序列化

可变缺点

  • 可能会被错误更改...

不变的职业

  • 不能错误地更改...

不变的缺点

  • 有时很难构建
  • 序列化器可能有问题

答案 1 :(得分:0)

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