当前位置: 首页 > news >正文

PO→DO→DTO→VO 和 DAO → DTO → VO

在分层架构设计中,PO→DO→DTO→VO 和 DAO → DTO → VO 是两种常见的数据流转模型,分别对应领域驱动设计(DDD)架构传统三层架构。以下是两者的核心区别与关系解析:


🔄 一、核心流程对比

1. DDD 架构:PO → DO → DTO → VO
  • PO(Persistent Object)
    • 定位:数据访问层(DAO/Repository),与数据库表结构严格映射。
    • 职责:存储原始数据,仅含基本字段(如 UserPOidusernamepassword)[citation:1][citation:2][citation:6]。
  • DO(Domain Object)
    • 定位:领域层(Service),封装业务逻辑的核心模型。
    • 职责
      • 聚合多个 PO 的数据(如 OrderDO 包含用户、商品等聚合数据)。
      • 包含业务行为(如计算运费、验证状态)。
  • DTO(Data Transfer Object)
    • 定位:应用层(Controller ↔ Service 或跨服务通信)。
    • 职责:传输脱敏后的数据(如隐藏密码、组合多表字段),确保跨层/跨服务数据安全[citation:1][citation:8][citation:9]。
  • VO(View Object)
    • 定位:表现层(Controller 返回给前端)。
    • 职责:适配前端展示(如日期格式化、状态转文字“男/女”)。

完整流转

数据库
PO
DO
DTO
VO
前端
2. 传统三层架构:DAO → DTO → VO
  • DAO(Data Access Object)
    • 定位:数据访问层接口,操作 PO(非对象本身)。
    • 职责:封装 CRUD 方法(如 UserDAO.findById() 返回 UserPO)。
  • DTO(Data Transfer Object)
    • 定位:Service 与 Controller 间传输。
    • 职责:裁剪敏感字段(如去除密码),避免暴露 PO 细节。
  • VO(View Object)
    • 定位:Controller 返回给前端,同 DDD 模式。

完整流转

数据库
DAO操作PO
DTO
VO
前端

⚖️ 二、关键区别与适用场景

维度DDD 模式(PO→DO→DTO→VO)传统三层架构(DAO→DTO→VO)
核心目标强业务逻辑封装,解耦领域模型与持久化层简化分层,快速开发
DO 的作用✅ 承载业务规则(如状态机、聚合根)❌ 无 DO 层,业务逻辑分散在 Service
PO 转换必要性✅ PO→DO 转换避免数据库污染领域模型❌ PO 直接转 DTO,可能混入持久化细节
适用场景复杂业务系统(电商、金融)中小型应用(管理后台、工具类系统)

代码示例


// DDD 示例
class OrderService {public OrderVO getOrder(Long id) {OrderPO orderPO = orderDAO.findById(id);OrderDO orderDO = convertToDO(orderPO); // 加入运费计算等逻辑OrderDTO orderDTO = convertToDTO(orderDO);return convertToVO(orderDTO); // 格式化日期等}
}
```| ```java
// 传统三层示例
class UserService {public UserVO getUser(Long id) {UserPO userPO = userDAO.findById(id);UserDTO userDTO = new UserDTO(userPO.getName(), userPO.getEmail());return new UserVO(userDTO); // 直接转换}
}

🔧 三、实际开发建议

  1. DDD 模式选择场景

    • 业务逻辑复杂(如订单状态流转、风控规则)。
    • 需高内聚领域模型(如 OrderDO 包含库存校验、支付计算)。
    • 微服务间需严格数据隔离(DTO 屏蔽领域细节)。
  2. 传统三层架构选择场景

    • 业务简单(增删改查为主)。
    • 开发效率优先(减少 DO 转换步骤)。
    • 团队规模小,无需严格领域划分。
  3. 通用原则

    • PO 永不出 DAO 层:避免数据库字段污染业务层。
    • VO 永不出 Controller:前端展示逻辑不渗透至服务层。
    • DTO 用于跨层/跨服务:确保传输数据最小化、安全化。

💎 总结

  • PO→DO→DTO→VODDD 的核心链路,通过 DO 隔离业务逻辑与持久化细节,适合复杂系统。
  • DAO→DTO→VO三层架构的简化版,以 DTO 替代 DO 减少层级,适合轻量级场景。
  • 本质差异:是否通过 DO 封装业务行为,决定了领域逻辑的隔离性与系统的可维护性。

注:实际开发中,DDD 模式可能省略 DTO(直接 DO→VO),但需确保领域模型不被前端污染。

http://www.dtcms.com/a/263392.html

相关文章:

  • w-笔记:uni-app的H5平台和非H5平台的拍照识别功能:
  • 数据可视化:5 分钟读懂其核心价值与技术实践
  • PyTorch 中 nn.Linear() 参数详解与实战解析(gpt)
  • Python + Selenium 自动化爬取途牛动态网页
  • Qt Quick 与 QML(四)qml中的Delegate系列委托组件
  • 七天学会SpringCloud分布式微服务——05——OpenFeign
  • 基于时间策略+应用过滤的游戏防沉迷方案:技术实现与工具推荐
  • Python pandas-profiling 详解:一键生成数据分析报告的利器
  • 使用自定义注解完成redis缓存
  • Windows Excel文档办公工作数据整理小工具
  • SpringCloud系列(43)--搭建SpringCloud Config客户端
  • Install Ubuntu 24.04 System
  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • ProPlus2024Retail 安装教程(详细步骤+激活方法)- 最新版安装包下载与使用指南
  • mysql运维语句
  • window显示驱动开发—在注册表中设置 DXGI 信息
  • SCAU期末笔记 - 操作系统 选填题
  • 【机器学习第四期(Python)】LightGBM 方法原理详解
  • 跨主机用 Docker Compose 部署 PostgreSQL + PostGIS 主从
  • [特殊字符]【联邦学习实战】用 PyTorch 从 0 搭建一个最简单的联邦学习系统(含完整代码)
  • 编程新手之环境搭建:node python
  • [论文阅读] Neural Architecture Search: Insights from 1000 Papers
  • 创客匠人解析知识变现赛道:从 IP 孵化到商业闭环的核心策略
  • xilinx axi datamover IP使用demo
  • 【STM32HAL-第1讲 基础篇-单片机简介】
  • C#数字格式化全解析:从基础到进阶的实战指南
  • 腾讯云空间,高性能显卡云,安装xinference报错,pip install 空间不够用了
  • leedcode:找到字符串中所有字母异位词
  • 04密码加密
  • 中钧科技参加中亚数字经济对话会,引领新疆企业数字化新征程!