目录
- 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. 小结
VO(视图模型) 与 DTO(数据传输对象)的区别
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 Persons{get;set;}
}
6. 小结
1.DTO是把数据进行传输的对象,重点在哪里进行 “传输”:展示层和应用层,只要是在 展示层和应用层 之间进行数据交互的,都是 Dto。
2.1个DTO对应1个客户端情况下,DTO = 视图模型;1个DTO对应多个客户端情况下,DTO ≠ 视图模型;