news 2026/6/15 9:24:58

DDD 聚合根 + 工厂模式:你的领域建模为什么一改就崩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DDD 聚合根 + 工厂模式:你的领域建模为什么一改就崩

DDD 聚合根 + 工厂模式:你的领域建模为什么一改就崩

我之前接手过一个订单系统,4 个开发一起写的,跑了 2 年。某天产品说"加个拼团功能",我看着代码结构,改了 23 个文件才把一个简单的"拼团订单"塞进去

复盘时老板问我为什么这么慢。我指着代码说:"这不是订单系统,是一坨面条。"

整个订单系统里,没有聚合根、没有工厂、没有领域事件,全是 Service 层堆业务逻辑。Service 调 Service,方法套方法,500 行的OrderService.createOrder()是常事。

这种代码的根本问题不是"烂",是设计模式的彻底缺位。本文用一个真实的订单中心重构案例,讲清楚 DDD 聚合根 + 工厂模式怎么落地。

你写的不是订单中心,是数据库的搬运工

先看你大概率写过的代码:

```java @Service public class OrderService { @Autowired private OrderRepository orderRepository; @Autowired private OrderItemRepository itemRepository; @Autowired private StockService stockService; @Autowired private CouponService couponService; @Autowired private PaymentService paymentService; @Autowired private UserService userService;

public Long createOrder(CreateOrderRequest req) { // 1. 校验用户 User user = userService.getById(req.getUserId()); if (user == null) throw new RuntimeException("用户不存在"); // 2. 校验库存 for (OrderItemDTO item : req.getItems()) { Stock stock = stockService.getBySkuId(item.getSkuId()); if (stock.getCount() < item.getCount()) { throw new RuntimeException("库存不足"); } } // 3. 校验优惠券 if (req.getCouponId() != null) { Coupon coupon = couponService.getById(req.getCouponId()); if (!coupon.isValid()) throw new RuntimeException("优惠券无效"); } // 4. 算价格 BigDecimal totalPrice = BigDecimal.ZERO; for (OrderItemDTO item : req.getItems()) { Product product = productService.getById(item.getSkuId()); totalPrice = totalPrice.add(product.getPrice().multiply(BigDecimal.valueOf(item.getCount()))); } if (req.getCouponId() != null) { totalPrice = couponService.applyDiscount(req.getCouponId(), totalPrice); } // 5. 扣库存 for (OrderItemDTO item : req.getItems()) { stockService.decrease(item.getSkuId(), item.getCount()); } // 6. 创建订单 Order order = new Order(); or
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 9:22:50

【配置】OpenClaw CLI Banner 体系详解

第一章:Banner 是什么? 每次在终端输入 openclaw 并按下回车,CLI 在真正开始干活之前,会先向 stdout 输出一段欢迎信息——这就是 Banner。它由两行内容组成: 组成部分 作用 示例 主行 (Version line) 显示版本、Git SHA、实例 URL 等关键调试信息 OpenClaw v2026.6.6 T…

作者头像 李华
网站建设 2026/6/15 9:20:34

3分钟掌握Liftoff:让Node.js命令行工具开发起飞 [特殊字符]

3分钟掌握Liftoff&#xff1a;让Node.js命令行工具开发起飞 &#x1f680; 【免费下载链接】liftoff Launch your command line tool with ease. 项目地址: https://gitcode.com/gh_mirrors/lift/liftoff Liftoff是一个强大的Node.js库&#xff0c;专门用于轻松启动命令…

作者头像 李华
网站建设 2026/6/15 9:20:31

为什么选择VISTA-4B?探索下一代GUI交互模型的7大优势

为什么选择VISTA-4B&#xff1f;探索下一代GUI交互模型的7大优势 【免费下载链接】VISTA-4B 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/VISTA-4B VISTA-4B是基于Qwen3.5 4B骨干模型训练的GUI-grounding视觉语言模型&#xff0c;通过创新的VISTA&#x…

作者头像 李华
网站建设 2026/6/15 9:15:16

怎样高效部署AI智能交易系统:TradingAgents完整实践指南

怎样高效部署AI智能交易系统&#xff1a;TradingAgents完整实践指南 【免费下载链接】TradingAgents-AI.github.io TradingAgents: Multi-Agents LLM Financial Trading Framework 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-AI.github.io 想要拥…

作者头像 李华