目录前端
VO(View Object):VO是显示视图模型,视图对象,用于展现层,它的做用是把某个指定页面(或组件)的全部数据封装起来。举例:展现层将DTO传送过来男性显示成帅哥(客户端1),或者显示成靓仔(客户端2);将帅哥或者靓仔,转换成男性,以DTO形式请求服务端。json
DTO(Data Transfer Object):DTO是传输模型,数据传输对象,在这里泛指用于展现层与服务层之间的数据传输对象。接受展现层传的性别男,返回展现层性别男。
后端
存在在展现层中。api
视图模型VO能够对应客户端的网页显示,一样的DTO好比性别男,能够对应多个VO进行显示,便可以对应多个客户端,好比VO1把性别男显示成帅哥,VO2把性别男显示成靓仔等等。数组
若是是一个DTO对应一个VO,则DTO=VO;可是若是一个DTO对应多个VO,则展现层须要把VO转换为服务层对应方法所要求的DTO,传送给服务层。从而达到服务层与展现层解耦的效果。
mvc
一个DTO能够对应多个从仓储层返回的DO(Domain Object,领域模型)的json数组,这里可使用AutoMapper来进行自适配。app
DTO不是为MVC的视图而存在的模型,而是为了适应来自前端请求而存在的。DTO模型把来自前端的请求(这个请求无论来自先后端分离的页面,仍是mvc的视图页面)封装在DTO模型中,而后服务端处理转换成Entity Framework中的领域模型。前后端分离
在一个DTO对应一个VO的时候,DTO = 视图模型。 DTO 和 VO 的属性值基本是一致的,并且他们一般都是 json对象,所以不必画蛇添足,但不要忘记这是实现层面的思惟,对于设计层面来讲,概念上仍是应该存在 VO 和 DTO ,由于二者有着本质的区别,DTO 表明服务层须要接收的数据和返回的数据,而 VO 表明展现层须要显示的数据。
应用时,能够在前端将DTO包成VO,也能够在服务端的Controller层,service层包成VO。VO转换成DTO同理。
在这种状况下能够实现,先后端相关的东西只有api的url和vo,并且大多数状况也是只有一个客户端的。url
在一个DTO对应多个VO的时候,DTO ≠ 视图模型。此时须要在前端将男性打包成帅哥或者靓仔显示;请求数据时,也须要前端将帅哥或者靓仔转换成男性,以DTO形式请求服务端。设计
网上介绍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;} }
1.DTO是把数据进行传输的对象,重点在哪里进行 “传输”:展现层和应用层,只要是在 展现层和应用层 之间进行数据交互的,都是 Dto。 2.1个DTO对应1个客户端状况下,DTO = 视图模型;1个DTO对应多个客户端状况下,DTO ≠ 视图模型;