应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

DTO与VO的区别

20348人阅读 2019/4/26 11:40 总访问:5182886 评论:6 收藏:1 手机
分类: 软件架构


概念


 VO(View Object):

      视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。


 DTO(Data Transfer Object):

      数据传输对象,泛指用于展示层与服务层之间的数据传输对象。


 PO(Persistent Object):

      持久化对象,就是和数据库保持一致的对象


VO与DTO的区别


1:针对的点不一样

VO   :  针对的是视图层,拿去就是直接展示数据

DTO  :   针对的是各种之间的数据传递,拿去显示之前可能还会进行数据加工


所以从广义上来说:

    层与层之间的传输都可以叫DTO,都可以叫数据传输对象。控制器给视图传递对象,其实也是数据传输,所以也可以叫dto。

    只是由于它们之间传递的对象,是用于显示,所以我们又给他取了另外一个更加针对性名字叫vo


在强行解释一波:

    大家可能会有个疑问(在笔者参与的项目中,很多程序员也有相同的疑惑):既然DTO是展示层与服务层之间传递数据的对象,为什么还需要一个VO呢?对!对于绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,因此没必要多此一举,但不要忘记这是实现层面的思维,对于设计层面来说,概念上还是应该存在VO和DTO,因为两者有着本质的区别,DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。


       用一个例子来说明可能会比较容易理解:例如服务层有一个getUser的方法返回一个系统用户,其中有一个属性是gender(性别),对于服务层来说,它只从语义上定义:1-男性,2-女性,0-未指定,而对于展示层来说,它可能需要用“帅哥”代表男性,用“美女”代表女性,用“秘密”代表未指定。说到这里,可能你还会反驳,在服务层直接就返回“帅哥美女”不就行了吗?对于大部分应用来说,这不是问题,但设想一下,如果需求允许客户可以定制风格,而不同风格对于“性别”的表现方式不一样,又或者这个服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,那么,问题就来了。再者,回到设计层面上分析,从职责单一原则来看,服务层只负责业务,与具体的表现形式无关,因此,它返回的DTO,不应该出现与表现形式的耦合。

    tip: 如果是单一项目 ,其实可以不用分得那么细,从数据库拿出来就是为了展示了,而不是还要给其他层提供服务 


在一个单一的项目中常用的做法



1:省略dto  

      就是把数据取出来的对象,直接返回给控制器层,然后控制器层进行数据加工变成vo,在交给前台。

      优点:通用性好,因为取出来的就是全部的字段,在控制器中进行数据加工,可以取到想要的字段,而传输层逻辑不用修改

                例如做基础增删改查代码的生成就很方便

      缺点:会查询全表,影响效率。当然也可以使用其他方法解决

      无图无真相:

    

    

2:省略vo

      数据库取出来部分字段,放入dto,然后dto传递到控制器,在传递到view中去,也就是说dto充当了各层直接的数据传输

      优点: 可以返回自己想要的数据,不同的业务针对性查询 ,不同业务耦合性更低

      缺点: 通用性差一点,不同的业务逻辑各层需要独立的写,果从单一职责来看不应该dto 直接丢视图

      如图:

      


3:dto,vo同时存在

     dto传递到控制器,控制器在进行一次数据加工,然后传递到view中去

     他们同时存在,然后不同的业务逻辑中可以选择,省略dto或者vo或者两同时使用

    

     当然这只是一种情况,其实还可以把各层的dto分得更细一点!这里就不讨论了



在分布式项目中vo,dto,po的做法


  分布式项目中,由于项目是独立的,model都是自己项目中的,所以就不存在省略了



  



   


个人见解,轻喷



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

饰心

2019/4/26 16:07:47

这几个图就解释的到位了[good]

剑轩:@饰心哈哈,开头一张图,内容随便编

2019/4/26 16:36:49 回复

雨雨雨雨辰

2019/4/26 16:38:52

[鼓掌][鼓掌][鼓掌][鼓掌]

2019/4/26 16:40:17 回复

超级无敌风火轮

2019/4/26 16:47:22

有图是比文字好理解哈[可怜]

剑轩:@超级无敌风火轮哈哈无图无真相

2019/4/27 15:03:35 回复

spring boot +swagger+mssql +lombok+mybatis的ListDTO 参数

一、参数为list实体model时(注意list参数一定要用对应的类型接收传回的参数,不然会报错)接口效果注意list参数默认是必填,...

abp vnext DTO用法。

为不同的操作创建不同的dto是abp nvext推荐的做法。官方的解释如下: 我们可以在创建和更新操作间分享 (重用) 相同的DTO. ...

分布式服务架构微服务架构概念的区别联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

jsController中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(","); for(vari=0;i<strs.length;i++){ $(&q...

Service-stack.redis配置连接池读写分离(处理并发相关等)

配置连接池与读写分类 //写节点(主节点) List<string>writes=newList<string>(); writes.Add("123456a...

CSS相对定位绝对定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

C委托事件

1.什么是委托?  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是...

asp.net core2.0 依赖注入 AddTransientAddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

Vue.js+Layer实现表格数据绑定更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

下划线、换行、回车、空格ASCII码值对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

数据读取器指定的"xx"不兼容。某个类型为"xx"的成员在同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery<SMachine>(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

git 下载提交命令

一.先使用git clone下载一个项目 git clone '项目地址' 这里要注意: clone的项目里边会自带git的一些信息,...

微信开发四 接受用户普通消息回复消息

微信接收用户普通消息的文章可以在官方中直接看微信普通消息分类:接受用户文本消息 与 回复文本信息 注意在接收用户普通...

记忆糖的关系【阅读听力】

Link Between Memory and SugarSugar On The BrainIt’s long been understood that there is a connection between memory...

婚姻心脏健康的关系【阅读听力】

Marriage and Heart HealthPlenty of studies have found that being married is generally good for health. One study ze...