别再滥用CRUD了——用Go和DDD彻底驯服复杂业务
DDD(领域驱动设计,Domain-Driven Design)诞生至今已二十余年,在Java和C#生态中早已成为复杂业务系统的标配方法论。然而在Go生态里,它似乎始终带着一层“水土不服”的滤镜——无泛型历史、缺乏继承、包管理边界松散,让不少团队在引入DDD时铩羽而归。
但事情正在发生变化。随着Go 1.18之后泛型落地,加上工程社区的持续摸索,一批融合Go语言特性与DDD核心精髓的实战方案开始在真实生产环境中证明价值。本文将从理论梳理到Go代码落地,完整拆解一套可复用的DDD实战方案,试图回应那个核心问题:在Go里做DDD,到底是过度设计,还是必经之路?
1. DDD解决什么问题?——回到问题本身
在谈论“怎么落地”之前,需要先回答“为什么需要DDD”。
现实是,绝大多数团队长期浸泡在CRUD范式里,遇到了远比预期更棘手的问题:
业务逻辑散落在各处。校验规则在Controller,计算规则在Service,数据组装在Repository——改一个需求要翻遍三四个文件;
贫血模型占据主导。实体类只有Getter/Setter,业务规则被抽到“工具类”里,领域对象沦为纯粹的数据容器;
跨模块依赖失控。订单模块直接调用库存模块的内部函数,支付状态变更时通知不到履约系统,最终一致性全靠“事后补偿+人工修复”。
DDD的答案很简单但有力:让业务逻辑回归领域模型,让技术细节成为实现细节。具体而
