领域驱动模型VO,BO,PO,DO,DTO概念介绍和区别

news2024/9/20 6:35:40

先来一张图,有一个直观地感受:

在这里插入图片描述

概念介绍

  • VO(View Object)视图对象

    用于展示层(和控制层Controller共同属于表现层),它的作用是把某个指定页面(或组件)的所有数据封装起来。说白了,就是在service层返回给前端页面展示的数据信息,也就是平时看到的网页列表中展示的数据信息

  • DTO(Data Transfer Object)数据传输对象

    展示层服务层之间的数据传输对象,它是一个简单的POJO类,通常只包含属性和属性的get/set 方法,没有业务逻辑,主要用于数据传输。

    DTO的设计思想是为了简化数据传输的过程,减少不必要的数据暴露网络传输的开销。

    比如一张表有 100 个字段,那么对应的 PO 就有 100 个属性。但是界面上只要显示 10 个字段,客户端用 WEB service 来获取数据,没有必要把整个 PO 对象传递到客户端,这时我们就可以用只有这 10 个属性的 DTO传递结果到客户端,这样也不会暴露服务端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为 VO

    DTO通常用于以下场景:
    (1)在远程调用中,将数据从服务提供者传输到服务消费者
    (2)在前端后端之间传输数据,如最开始的架构图,DTO横跨两层,在Controller层和Service层之间使用。通常情况下,DTOController层用于接收响应客户端请求,在接收客户端请求时,Controller可以使用DTO对象来解析请求参数,并将数据传递给Service层进行业务处理,在响应客户端请求时,Controller可以将Service层返回的数据转换DTO对象,并以适当的格式返回给客户端
    (3)在分布式系统中,将数据从一个节点传输到另一个节点。
    (4)在微服务架构中,将数据从一个微服务传输到另一个微服务.

  • BO(Business Object)业务对象

    BO就是PO组合,数据库里面多个PO对象构成的相对复杂对象,业务对象BO主要作用是把业务逻辑封装为一个对象(包括一个或多个其它的对象)

    比如PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO个人网站行为对象。再比如一个简历,有教育经历、工作经历、社会关系等等,可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO,然后建立一个对应简历的BO对象处理简历,每个BO包含这些PO,这样处理业务逻辑时,就可以针对BO去处理

    BO是一个业务对象,一类业务就会对应一个BOBO会有很多业务操作,也就是说除了getset方法以外,BO会有很多针对自身数据进行计算的方法

    BO也是横跨两层,原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成

    很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用,通常需要将BO转化成PO,才能进行数据的持久化,反之,从数据库中得到的PO,需要转化成BO才能在业务层使用

  • PO(Persistant Object)持久对象

    PO包括属性构造函数getset方法,PO类是一个模板定义,描述了数据库记录的结构和属性,而PO对象是基于PO实例化的具体记录对象

    PO对象PO实例化对象,它是在运行时创建的具体记录PO对象可以操作和访问数据库中的数据。每个PO对象代表数据库中的一条记录,它的属性值对应数据库表中的字段值

    简单说一个PO对象就是数据库中的一条记录PO对应着数据库中的一个表,定义的是PO类,PO对象是运行时创建出来的一条记录(包含多个属性)

  • DO(Domain Object)领域对象

    从现实世界中抽象出来的有形或无形的业务实体,目前有两种概念:

    (1)一个是阿里巴巴的开发手册中的定义

    DO( Data Object) = PO

    (2)另一个是在DDD(Domain-Driven Design)领域驱动设计中

    DO(Domain Object) = BO (这种应该多一点)

概念区别

  • VO与DTO的区别

    对于绝大部分的应用场景来说,DTOVO的属性值基本是一致的,但是DTO代表服务层(service)需要接收的数据和返回的数据,而VO代表展示层需要显示的数据

    如果客户端不止一个(PC端、手机端等),或者客户端需要定制,则需要把VODTO区分开来,否则可以只用一个DTO

  • DO(BO)与PO的区别

    BO对象关注业务逻辑和行为,它们封装了业务规则和操作,用于实现业务逻辑的控制和处理。PO对象关注数据存储和持久化,它们提供对数据库记录操作访问接口

    BO对象通常是可变的,因为业务逻辑需要对其进行修改和操作。而PO对象通常是不可变的,因为它们代表了数据库中的静态记录,应保持与数据库的一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习算法

机器学习擅长的任务: ● 回归(regression) ● 分类(classification) ● 聚类(clustering) 1.回归(regression) 回归是处理连续数据时使用的方法,如时间序列数据。 …

vue使用obs华为云上传图片或者视频

可惜只支持web和h5 api链接 引入,位置自己放,我放了两个其实一个就可以 import ObsClient from "./../common/esdk-obs-browserjs-without-polyfill.3.23.5.min.js";使用 Bucket桶名;Key可以理解为参数;SourceFile文…

香豆素荧光标记652966-03-5,ATTO425 acid,ATTO 425 羧酸,进行简析说明

中文名称:ATTO 425 羧酸 英文名称:ATTO425 COOH,ATTO-425 carboxylic acid 规格标准:10mg,25mg,50mg CAS:652966-03-5 分子式:C22H27NO6 分子量:401.46结构式&#xff1a…

90.qt qml-Table表格组件(支持表头表尾固定/自定义颜色/自定义操作按钮/插入排序)

众所周知,qml table在目前版本还很废,qt5的table完全就没法用,在之前章节就写过: 88.qt qml-TableView学习(一)_诺谦的博客-CSDN博客 所以本章便参考VUE-Element的Table外观组件实现一个可排序可操作的Table组件. 1.组件介绍 GIF如下所示: 排序支持数字和字符串排序。 …

Mysql5.7.41windows安装

Mysql5.7.41windows安装 Mysql5.7.41windows安装Mysql5.7.41官方下载mysql安装 配置PATH路径,任意位置打开cmd都可以连接Mysql环境验证,并登录友情链接 Mysql5.7.41windows安装 本文主要完成windows从下载到安装的安装文档撰写。 Mysql5.7.41官方下载 …

html实现会拐弯的时间线,jquery实现会拐弯的时间线,css实现会拐弯的时间线

前言 jquery html css实现一个会拐弯的时间线 基于此网址整改,参考:https://www.jq22.com/webqd5873 效果 实现 基于jQuery,需要引入jQuery.js,没有必要使用太高版本,够用就行 jquery下载:https://www…

SadTalker 学习笔记

SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation 摘要 Generating talking head videos through a face image and a piece ofspeech audio still contains many challenges. i.e., unnatural head mo…

前端页面调用EXE应用程序

文章目录 1️⃣ 操作步骤1.1 操作注册表1.1.1 创建 xcLeigh.reg 注册表文件1.1.2 安装 xcLeigh.reg 注册表文件1.1.3 放入EXE文件 1.2 界面代码1.3 运行效果 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details…

大专毕业,从6个月开发转入测试岗位的一些感悟 —— 写在测试岗位3年之际

时光飞逝,我从前端开发岗位转入测试岗位已经三年了,这期间从迷茫到熟悉,到强化,到熟练,到总结,感受还是很深的! 三年前的某一个晚上,我正准备下班回家,我们的项目经理把…

嵌入式Linux中的 gpio、gpiod基本分析

GPIO 应该是每个嵌入式设备都避免不了的。最近在做项目的时候,也遇到这方面的问题,所以简单总结一下。 现在内核里面多了 gpiod 的来控制 gpio 口,相对于原来的形式,使用 gpiod 的好处是我们申请后不进行 free 也没有什么问题。但…

Seata分布式事务AT、TCC、SAGA、XA模式

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 AT模式 🍮实现原理 阿里SEATA独有模式,通过生成反向SQ…

STM32读取24位模数转换(24bit ADC)芯片ADS1231数据

STM32读取24位模数转换(24bit ADC)芯片ADS1231数据 ADS1231是一款TI公司出品的24位ADC芯片,常用于与称重传感器配合实现体重计的应用。这里介绍STM32读取ADS1231的电路和代码实现。ADS1231的特点为通过硬件管脚可控制两种采样速率&#xff0…

日期与字符串相互转化(自定义日期工具类总结,Hutool工具类使用)

一、将日期格式化成字符串输出(Date转String) Java旧的时间API饱受诟病,Java8以后提供了新的时间API,在java.time包下。 //获取当前时间LocalDateTime dateLocalDateTime.now();//创建日期时间对象格式化器,日期格式类…

Hadoop学习---11、HA高可用

1、Hadoop HA高可用 1.1 HA概述 1、所谓HA(High Availablity),即高可用(7 * 24小时不中断服务)。 2、实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。 …

数字化转型,低代码开发真的靠谱?

关于数字化转型,有这么一种定义,即利用数字化技术和能力来驱动企业商业模式创新和商业生态系统重构的一种途径与方法。通俗点说,数字化的核心和目的就是通过数字化技术,实现业务的转型、创新和增长,提供新的营收点与价…

超详细,性能测试三大模式详解,资深测试老鸟一文道破...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在性能测试工作中…

IC芯片自动测试系统平台ATECLOUD:提高半导体制造效率与质量

近年来,随着半导体产业的快速发展,IC芯片在各种电子设备中扮演着越来越重要的角色。然而,为了满足不断增长的需求和保持竞争力,制造商需要不断提高生产效率并确保产品质量。ATECLOUD——一款基于云计算技术的IC芯片自动测试系统平…

租赁小程序|人车网租赁系统|电动车租赁系统包含哪些功能?

随着科技不断完善,租赁行业的发展也越来越好,电动车也开始进行线上推广租赁,不仅可以让人们更加方便的租用电动车,还让商家可以通过线上模式带动线下的经营,不同于传统的汽车租赁,用户只要打开手机就可以进…

MySQL-5.7.19版本安装详解

MySQL-5.7.19版本安装详解 1. 软件下载 Mysql5.7地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 2. 软件安装 2.1 第一步:解压 下载后会得到mysql-5.7.19-winx64的zip 安装文件,先将其解压解压的路径最好不…

微信小程序导入Vant Weapp ui组件库2023年最新版

微信小程序导入Vant Weapp ui组件库2023年最新版 写这篇文章的原因是Vant Weapp的官方文档快速上手是有一定的问题的,没错,我就是那个试错的人,弄了一下午才发现问题所在,所以写了一篇正确的导入教程。 第一步:在项目…