美文网首页
业务实体为什么分类?PO,BO,VO,DTO?

业务实体为什么分类?PO,BO,VO,DTO?

作者: 和平菌 | 来源:发表于2020-12-18 18:28 被阅读0次

一、开发的时候我们可以一个实体贯穿全剧,那我们为什么要对实体分类呢?

1、为什么要用PO?

PO用来持久化的对象,无论是字段还是类型都跟数据库表一一要对应,所以就有了PO

2、为什么要用BO?

BO是用来处理业务用的实体,业务层的入参和出参都是BO,整个业务都是围绕BO来处理

a) 有些字段应该是枚举或者对象,但是View层给你的或者数据库PO层给你的可能都是基本数据类型,我们直接使用来处理业务非常非常不方便

b) 有业务处理用到的属性和方法,这些在VO里或者PO里都不恰当

3、为什么要有VO?

VO是拿给前端展示给用户的实体

a) 有一些敏感的属性不能给前端展示,涉及安全问题

4、为什么要有DTO?

当你要调用外部业务的服务的时候,比如我们JSF服务,业务提供方也面临着类似VO一样的问题,哪些属性是可以给你的,哪些是不能给你的,给你的一些属性有可能还会有更进一步的加工。

二、分层带来的好处

1、各层次之间都解耦了

比如你可以单独把你的Servce拿出去独立部署

再比如说你调用了外部提供的JSF服务,然后你用对方提供的JAR包里的实体直接处理了业务,那万一有一天对方的JAR包升级了,或者不维护了,那你的服务是不是也会面临升级维护或者直接不可用的情况。

2、对于使用者来说比较清晰、容易维护扩展

当有人调用你的接口或者服务的时候发现接口里有一大堆参数,大多数根本是用不到的,每次用都要查一次,是不是很费劲

有人维护你开发的业务的时候也面临一样的问题,比如这个属性或者方法到底是哪个地方用到的?

三、分层带来的难处

1、每个对象可能要创建多个实体,实体之间要相互进行来回转换

怎么解决这个问题:

a) 代码生成器自动生成

b) 封装基类,自动去进行转换

四、具体怎么实践?

先上图

image.png

举例:

1、前端传给我们的参数我们自动封装成了VO

2、我们在Controller里把VO转成了BO,然后调用Service里的方法

3、Service层处理业务的时候发现要调用一个外部服务,那么就组装一个DTO参数去调用外部RPC服务,最终得到的DTO的结果我们在转成我们自己的BO再参与到业务处理中

4、Service处理的结果要查询DB,那么从DAO层返回来的是一个PO,我们也是把PO先转成我们的BO在参与业务处理

5、Service层处理完业务返回了一个BO,然后在Controller里我们把他转成VO再对外提供出去

五、遵循了原则?

原则就是永远不要在我这一层使用上层的POJO,所有跟上层交互的业务POJO都要转成我这一层的POJO来跟我交互

下层不依赖上层

相关文章

网友评论

      本文标题:业务实体为什么分类?PO,BO,VO,DTO?

      本文链接:https://www.haomeiwen.com/subject/yzixnktx.html