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变得非常简单。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

为什么应该用record来定义DTO相关推荐

  1. 为什么应该用record来定义DTO(续)

    前言 上次,我们介绍了因为DTO的"不变性",应该用record来定义DTO. 今天,我们来说明用record来定义DTO的另一个好处. 问题 首先,我们实现一个Controler ...

  2. .NET 6新特性试用 | record struct

    前言 在以前的文章中,我们介绍过record类型,它具有不变性(<为什么应该用record来定义DTO>)和值相等性(<为什么应该用record来定义DTO(续)>). rec ...

  3. 系统中的DTO与MO

    1.概述 在一个Web服务的实现中,我们常常需要访问数据库,并将从数据库中所取得的数据显示在用户页面中.这样做的一个问题是:用于在用户页面上展示的数据和从数据库中取得的数据常常具有较大区别.在这种情况 ...

  4. Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper

    1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...

  5. J2EE开发全程实录

    第1章  正则表达式.... 1 1.1  为什么要用正则表达式... 1 1.2  正则表达式入门... 3 1.2.1  正则表达式中元字符的用法... 4 1.2.2  Java中的正则表达式A ...

  6. SQL server和postgresql差异

    数据类型 数字类型 Sql server Numeric/ decimal 精确数值型 从-10 的38 次方-1,到10 的38 次方-1 bit 整型 其值只能是0.1 或空值 int 整型 -2 ...

  7. ExtJs之数据和ComboBox控件

    一.如何获取数据 在ExtJs中获取数据主要靠下面四个类: Ext.data.DataProxy.Ext.data.Record.Ext.data.DataReader.Store.下面对这三个类做个 ...

  8. SpringBoot应用开发框架搭建

    Spring的简史 第一阶段:XML配置,在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分放到不同的配置文件里,那时候需要频繁的在 ...

  9. DTO--数据传输对象

    层间数据传输的过程就是服务的执行者将数据返回给服务的调用者的过程.在非分布式系统中由于有类似Open session in view这样的"怪胎解决方案"的存在,所以层间数据传输的 ...

最新文章

  1. android入门学习一 基本概念
  2. [Android] Android颜色对应的xml配置值
  3. iOS:Tools:快速注释Doxygen
  4. 【Spring注解系列06】FactoryBean注入对象用法
  5. 功能性平台创新-农业大健康·杨建国:谋定都江堰精华灌区
  6. Python: 复数的数学运算
  7. 轻松搞定对容器实例日志设置定期清理和回卷
  8. 2015年《大数据》高被引论文Top10文章No.2——大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(下)...
  9. Instant Complexity--POJ 1472
  10. 用iptables实现NAT
  11. 获取自身进程结构和csrss.exe进程结构 explorer.exe进程结构
  12. u盘linux 修复grub,Ubuntu 18.04与Win10双系统U盘安装后的GRUB2修复
  13. layui重置按钮函数,支持文件
  14. java并发知识汇总
  15. centos 7 显示远程窗口到本地
  16. 词向量之TF-IDF模型详解
  17. 股票量化策略:数学天才们的印钞机
  18. arcgis rest服务无法访问
  19. Linux小项目-倒车影像功能设计
  20. Proteus8.9 VSM Studio Keil编译器仿真AT89C51RD2系列019_lcdPG12864

热门文章

  1. JFinal整合CKFinder
  2. CISCO IOS SLB服务器负载均衡
  3. Yahoo网站性能最佳体验的34条黄金守则
  4. 微型计算机储存信息的基本单位是什么,16.磁盘存储器存、取信息的最基本单位是...
  5. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...
  6. 在应用程序中实现对NandFlash的操作
  7. [Delphi]根据输入日期按年月周日输出日期段
  8. Teams App如何选择用户
  9. 镜像VirtualBox 下安装 CentOS 7搭建python项目
  10. 反射调用 java bean的set和get方法