• VO(视图模型) 与 DTO(数据传输对象)的区别


    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<Person> Persons{get;set;}
    }
    

    6. 小结

    1.DTO是把数据进行传输的对象,重点在哪里进行 “传输”:展示层和应用层,只要是在 展示层和应用层 之间进行数据交互的,都是 Dto。
    2.1个DTO对应1个客户端情况下,DTO = 视图模型;1个DTO对应多个客户端情况下,DTO ≠ 视图模型;

  • 相关阅读:
    个人永久性免费-Excel催化剂功能第86波-人工智能之图像OCR文本识别全覆盖
    git删除远程仓库的文件或目录
    使用document.execCommand复制内容至剪贴板
    使用clipboard.js实现复制内容至剪贴板
    正则匹配目标字符串不等于某些特定的字符串
    substr与substring的用法
    使用hexo搭建个人博客
    git修改最后一次commit的内容
    gulp压缩文件最简示例
    gulp最简示例
  • 原文地址:https://www.cnblogs.com/JerryMouseLi/p/11069237.html
Copyright © 2020-2023  润新知