在DDD领域驱动开发中会用到数据传输对象(Data Transfer Objects),下面是对数据传输对象作用的总结
1、抽象领域层
在展现层中数据传输对象对领域对象进行了有效的抽象。这样你的层(layers)将
被恰当的隔离开来。甚至当你想要完全替换展现层时,你还可以继续使用已经存在的
应用层和领域层。反之,你可以重写领域层,修改数据库结构,实体和 ORM 框架,
但并不需要对展现层做任何修改,只要你的应用层没有发生改变。
2、数据隐藏
想象一下,你有一个User实体拥有属性Id, Name, EmailAddress和Password。
如果 UserAppService 的 GetAllUsers()方法的返回值类型为 List<User>。这样任何
人都可以查看所有人的密码,即使你没有将它打印在屏幕上。这不仅仅是安全问题,
这还跟数据隐藏有关。应用服务应只返回展现层所需要的,不多不少刚刚好。
3、序列化&惰性加载
当你将数据(对象)返回给展现层时,数据有可能会被序列化。举个例子,在一个
返回 Json 的 MVC 的 Action 中,你的对象需要被序列化成 JSON 并发送给客户端。
直接返回实体给展现层将有可能会出现麻烦。
几乎所有的 ORM 框架都支持惰性加载。只有当你需要加载实体时它才会被加
载。比如 User 类型引用 Role 类型。当你从数据库获取 User 时,Role 属性并没有
被填充。当你第一次读取 Role 属性时,才会从数据库中加载 Role。所以,当你返回
这样一个实体给展现层时,很容易引起副作用(从数据库中加载)。如果序列化工具
读取实体,它将会递归地读取所有属性,这样你的
总结:以上内容摘抄自:ABP开发指南第二章第二节
原文地址:https://www.cnblogs.com/minrh/p/9967018.html