最近在看阿里规约。 阿里对于 DO,DTO,VO 的规约为
DO ( Data Object ):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO ( Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象。
VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
但是我在使用 mybatis 分页时,一般会在 Controller 里直接调用分页方法,返回 IPage 对象 那么 这个时候 Ipage 对象对应的泛型应该用哪个呢? DO 还是 DTO?
1
uselessVisitor OP 没有大佬来解答一下吗。。
|
2
goodboy95 2020-11-10 14:00:51 +08:00
如果 IPage 是分出来的一页数据,按照意思来说是 DTO
如果 IPage 是专门用来分页的一个 object,这就涉及到我的知识盲区了,毕竟我自己想一辈子都想不出这种分法 |
3
uselessVisitor OP @goodboy95 IPage 这个对象是 mybatis-plus 自带的。。用来放查出来的一页数据
|
4
howells 2020-11-10 14:54:50 +08:00
就是 vo 把,我对他们的理解就是,你接收请求的参数叫对象叫 dto,你返回的叫 vo
|
5
howells 2020-11-10 14:58:24 +08:00
你应该把 Ipage 转成一个 VO 类,然后传出去
|
6
uselessVisitor OP @howells 嗯。。那这样的话对于分页来说,我就在 service 组装 VO,然后给 controller 了,因为涉及到查询到的 current,size 等。。
|
7
zhazi 2020-11-10 15:34:27 +08:00
https://docs.oracle.com/cd/A97335_02/apps.102/bc4j/developing_bc_projects/bc_awhatisavo.htm
希望楼上不要误导人 vo 两种解释 value object, view object 这两种 VO 都不应该返回给请求方 引用 DTO 是为了与业务 Domain 解耦合,在请求时对请求参数进行聚合 |
8
howells 2020-11-10 15:38:47 +08:00
@zhazi VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
但是你看这个描述,它就不是数据库层描述的对象呀,就是给前端渲染的,是不是我们理解的不是同一个东西 |
11
zhazi 2020-11-10 15:52:51 +08:00
@howells
关于这个 VO 的解释都是出自阿里的 java 开发规约。每个领域概念出现是为了解决问题而出现的。 DTO/VO 的概念重复。 有的公司会对给请求叫 xxxRequestObject 返回值 xxxResponseObject 这无可厚非所有领域概念都是人抽象出来的。 如果大多数人能从这个抽象概念中获取到实质的好处。那么这个概念就被推崇。如果不能那么这个概念只能提高架构的复杂度。加速代码腐坏。 https://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans Early J2EE literature used the term value object to describe a different notion, what I call a Data Transfer Object. They have since changed their usage and use the term Transfer Object instead. |
12
dddd1919 2020-11-10 23:31:30 +08:00 1
mybatis 返回的是数据库的实体映射,对象和数据库的结构是完全对应的,所以应该直接用 model 或者你说的 DO 。
DTO 理解上是系统内部的一种传输对象载体,比如 RPC 之间调用传输的数据结构。 VO 作为外部交互使用的数据结构,负责内部实体和外部展示的相互转换,比如 http API 会用 VO,这样做的好处就是在转换时做到展示友好和屏蔽内部逻辑 你说的 controller 直接调用 mybatis 是不太规范的方式,应该把 mybatis 调用相关的处理逻辑放在 service 层,把结果返回给 controller,由 controller 转换成 VO 后返回给调用方,或者 service 直接转换好 VO 返回去 这三者之间的关系我理解的就是最底层 /数据映射层 DO,内部 /中间层 DTO,上层 /对外层 VO |
13
uselessVisitor OP @dddd1919 大佬,我这又有个问题,那么如果是一对多查询,使用 ResultMap 设置返回对象,那么返回值对应的实体类应该也是属于 DO 层的吗?
|