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 ≠ 视图模型;

VO(视图模型) 与 DTO(数据传输对象)的区别的更多相关文章

  1. 我们为什么需要DTO(数据传输对象)

    原文:http://www.cnblogs.com/Gyoung/archive/2013/03/23/2977233.html DTO即数据传输对象(Data Transfer Object).之前 ...

  2. 为什么需要DTO(数据传输对象)

    DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...

  3. (扫盲)DTO数据传输对象

    DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...

  4. 2、DTO(数据传输对象)

    DTO:Data Transfer Object 即数据传输对象. 有些人会问这个DTO是干嘛的,不是已经有了Model实体类了么? 首先说一下,DTO是干嘛了.DTO的引入,应该说是伴随着分层架构设 ...

  5. DTO数据传输对象详解

    文章目录 一.DTO是什么? 二.DTO解决的问题 三.代码演示 一.DTO是什么? DTO (数据传输对象) 数据传输对象(DTO),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据 ...

  6. DTO数据传输对象

    如果有多个对象需要传输到页面上需要用DTO传输

  7. 贫血模型;DTO:数据传输对象(Data Transfer Object);AutoMapper ;Domain Model(领域模型);DDD(领域驱动设计)

    ====================== 我自己的理解 ========================== 一:  DTO  我自己的理解,就是 比如你有一个类,跟数据库的table表结构一模一 ...

  8. java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...

  9. Java (PO,VO,DAO,BO,POJO,DTO) 几种对象解释

    1. PO:persistant object 持久对象 可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对 ...

随机推荐

  1. css重置样式

    <style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...

  2. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    [摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...

  3. Android手机打造你的Python&Java开发工具!

    开发者桌面 之前写过一篇文章:将Android手机打造成你的python开发者桌面 在安卓手机上通过Termux软件,创建一个模拟Linux系统,它的好处就是无需root,即可在手机中编写Python ...

  4. 利用modelarts和物体检测方式识别验证码

    近来有朋友让老山帮忙识别验证码.在github上查看了下,目前开源社区中主要流行以下几种验证码识别方式: tesseract-ocr模块: 这是HP实验室开发由Google 维护的开源 OCR引擎,内 ...

  5. apache thrift 和 apache jersey 记录

    几篇好的入门文档链接: 1. Hello World by Thrift Using Java 2. Thrift 实例 Helloworld 3. Thrift版的Hello World 4. Th ...

  6. zabbix分布式监控服务 安装与配置

    zabbix安装与配置   一.什么是zabbix及优缺点(对比cacti和nagios) Zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存 ...

  7. react-native-linear-gradient颜色渐变

    目录 一 安装 二 使用 2.1 colors 2.2 start / end eg1:斜角渐变 eg2: 从左到右 2.2 locations eg1: 0.4是渐变的起点,0.6是渐变的终点 一 ...

  8. 2017 CCPC秦皇岛 G题 Numbers

    DreamGrid has a nonnegative integer . He would like to divide  into nonnegative integers  and minimi ...

  9. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  10. latex常用技巧

    画表格 \usepackage{multirow} \begin{tabular}{cccc} \hline \multicolumn{4}{c}{学生信息}\\ \hline 班级& 姓名& ...