目录
VO(视图模型) 与 DTO(数据传输对象)的区别
1.VO 与 DTO 概念
2.VO 视图模型的必要性与解耦
2.1 视图模型
2.2 视图模型存在的必要性
2.3 视图模型的解耦
3.DTO 存在的必要性
3.1 数据传输对象
3.2 DTO 数据传输对象存在的必要性
4. VO 与 DTO 的区别
4.1 DTO = 视图模型
4.2 DTO ≠ 视图模型
5. AutoMapper 的使用场景
6. 小结
1.VO 与 DTO 概念
VO(View Object):VO 是显示视图模型, 视图对象, 用于展示层, 它的作用是把某个指定页面 (或组件) 的所有数据封装起来. 举例: 展示层将 DTO 传送过来男性显示成帅哥(客户端 1), 或者显示成靓仔(客户端 2); 将帅哥或者靓仔, 转换成男性, 以 DTO 形式请求服务端.
DTO(Data Transfer Object):DTO 是传输模型, 数据传输对象, 在这里泛指用于展示层与服务层之间的数据传输对象. 接受展示层传的性别男, 返回展示层性别男.
2.VO 视图模型的必要性与解耦
2.1 视图模型
存在在展示层中.
2.2 视图模型存在的必要性
视图模型 VO 可以对应客户端的网页显示, 同样的 DTO 比如性别男, 可以对应多个 VO 进行显示, 即可以对应多个客户端, 比如 VO1 把性别男显示成帅哥, VO2 把性别男显示成靓仔等等.
2.3 视图模型的解耦
如果是一个 DTO 对应一个 VO, 则 DTO=VO; 但是如果一个 DTO 对应多个 VO, 则展示层需要把 VO 转换为服务层对应方法所要求的 DTO, 传送给服务层. 从而达到服务层与展示层解耦的效果.
3.DTO 存在的必要性
3.1 数据传输对象
一个 DTO 可以对应多个从仓储层返回的 DO(Domain Object, 领域模型)的 JSON 数组, 这里可以使用 AutoMapper 来进行自适配.
3.2 DTO 数据传输对象存在的必要性
DTO 不是为 MVC 的视图而存在的模型, 而是为了适应来自前端请求而存在的. DTO 模型把来自前端的请求 (这个请求不管来自前后端分离的页面, 还是 mvc 的视图页面) 封装在 DTO 模型中, 然后服务端处理转换成 Entity Framework 中的领域模型.
4. VO 与 DTO 的区别
4.1 DTO = 视图模型
在一个 DTO 对应一个 VO 的时候, DTO = 视图模型. DTO 和 VO 的属性值基本是一致的, 而且他们通常都是 JSON 对象, 因此没必要多此一举, 但不要忘记这是实现层面的思维, 对于设计层面来说, 概念上还是应该存在 VO 和 DTO , 因为两者有着本质的区别, DTO 代表服务层需要接收的数据和返回的数据, 而 VO 代表展示层需要显示的数据.
应用时, 可以在前端将 DTO 包成 VO, 也可以在服务端的 Controller 层, service 层包成 VO.VO 转换成 DTO 同理.
在这种情况下可以实现, 前后端相关的东西只有 API 的 url 和 vo, 而且大多数情况也是只有一个客户端的.
4.2 DTO ≠ 视图模型
在一个 DTO 对应多个 VO 的时候, DTO ≠ 视图模型. 此时需要在前端将男性打包成帅哥或者靓仔显示; 请求数据时, 也需要前端将帅哥或者靓仔转换成男性, 以 DTO 形式请求服务端.
5. AutoMapper 的使用场景
网上介绍 AutoMapper 的使用方法的很多, 这里不做介绍, 主要说下使用场景.
AutoMapper 是 DTO 模型和领域模型之间的映射. AutoMapper 处理 DTO 模型和领域模型的转换. 通常的做法是: DTO 模型 C 中包含领域模型 A 对应的 DTO 模型 A 和领域模型 B 对应的 DTO 模型 B, 然后在服务端, 分别把 DTO 模型 A 和 DTO 模型 B 通过 AutoMapper 转换成领域模型 A 和领域模型 B.
- // 比如视图模型:
- public class PersonViewModel
- {
- public string FirstName{get;set;}
- public string LastName{get;set;}
- }
- // 比如领域模型:
- public class Person
- {
- public string Name{get;set;}
- }
- // 领域模型在上下文中:
- public class MyDbContext : DbContext
- {
- public DbSet<Person> Persons{get;set;}
- }
6. 小结
1.DTO 是把数据进行传输的对象, 重点在哪里进行 "传输": 展示层和应用层, 只要是在 展示层和应用层 之间进行数据交互的, 都是 Dto.
2.1 个 DTO 对应 1 个客户端情况下, DTO = 视图模型; 1 个 DTO 对应多个客户端情况下, DTO ≠ 视图模型;
来源: https://www.cnblogs.com/JerryMouseLi/p/11069237.html