您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

为什么应该用record来定义DTO

寒冰屋 发布时间:2021-08-11 13:13:47 ,浏览量:1

DTO

DTO是数据传输对象(Data Transfer Object)的简称,主要用作在进程之间传送数据。

DTO的特点是它不包含任何业务逻辑或行为。

下面是一个典型的DTO定义:

public class UserDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}
DTO的不变性

在实际使用中,我们并没有在进程之间来回传输具体的对象,而是使用某种形式的序列化,因此,DTO的属性不需要更改。

另外,考虑到DTO的用途,如果DTO的属性在传输过程中发生变化,数据将不再准确。

所以,DTO应该以无法更改的方式创建——它们应该是不可变的。

class实现方式

为什么以前没强调过DTO的不变性呢?因为在C#中实现是一件比较麻烦的事。

虽然我们可以定义私有setter来实现不可变类型,例如:

public class UserDto
{
    public UserDto(int id, string name)
    {
        this.Id = id;
        this.Name = name;
    }
    public int Id { get; private set; }
    public string Name { get; private set; }
}

从下图我们可以看到,值必须通过构造函数传递给属性。

而且正如预期的那样,我们无法在创建对象后再为属性赋值:

图片

然而,这种方法有个很明显的缺点,如果我们增加一个属性,就必须调整一次构造函数。

record实现方式

从C# 9开始,可以使用record关键字定义一个引用类型,用来提供用于封装数据的内置功能。

它在设计上就具备创建具有不可变属性的能力。例如:

public record UserDto(int Id, string Name);

是不是非常简洁!

注意我们定义的是属性,所以参数用的PascalCase。

而且从下图我们可以看到,它与class创建对象方式相同。

同样在创建对象后不能再为属性赋值:

图片

另外有一个附带的好处,如果增加了属性,立刻可以知道哪些代码位置需要修改:

public record UserDto(int Id, string Name, string Address);

图片

结论

在本文中,我们介绍了record类型,它使得在C#中使用不可变DTO变得非常简单。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0419s