在软件开发中,有一个永恒的难题:业务逻辑越来越复杂,代码越来越难以维护。早期基于MVC架构的CRUD应用运转良好,但随着业务深入,开发团队很快会陷入一个困境——“业务逻辑到底该放在哪里?”
领域驱动设计(Domain-Driven Design,简称DDD),正是为解决这个难题而生。它由软件大师Eric Evans在2003年提出,旨在通过将业务领域知识作为系统设计的核心驱动力,构建与业务高度对齐的软件模型。DDD不是一种具体的架构风格,而是一套完整而系统的设计方法,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界。
本文将系统讲解DDD的核心理念、战略设计与战术设计、分层架构等内容,无论你是刚接触DDD的开发者,还是希望提升架构设计能力的产品经理或架构师,都能从中获得启发。
在传统开发模式中,业务逻辑往往与数据库操作、框架特性混杂在一起,导致代码可读性差、维护成本高。DDD的核心思想是将纯业务逻辑与技术实现彻底分离,让开发者能够像业务专家一样思考问题。
DDD的首要原则是建立统一语言(Ubiquitous Language) 。所有人员——包括开发人员、测试人员、产品经理、业务专家——都应使用一套统一的、基于领域模型的通用语言。这意味着代码中的类名、方法名必须直接反映业务概念,而不是含义模糊的DataProcessor或Manager。例如,电商系统中应该有Order类及其place()(下单)方法,而不是一个通用的OrderService臃肿地把所有逻辑都装进去。
DDD的第二个核心理念是聚焦核心领域(Core Domain) 。在一个复杂的业务系统中,不同子域的业务价值不同。核心域是业务成功的关键因素,需要投入最多的设计精力;通用域是多个子域共享的通用功能;支撑域则是支撑其他子域的基础设施。
DDD的实践分为两个维度:战略设计和战术设计。战略设计关注领域划分与边界定义,解决“做什么”;战术设计聚焦具体代码实现,解决“怎么做”。

面对一个庞大的系统,试图用一个单一的模型来覆盖所有业务范围是不切实际的。DDD的战略设计部分提供了划分复杂系统的强大工具。
领域是指企业要解决的问题域。以内容社区系统为例,整个“内容社区”是领域,它可以分解为用户管理、读者、支付、社区等多个子域。其中社区可能属于核心域,而支付属于支撑域。
核心提示:在战略设计中,重要的是识别哪些子域是业务的核心竞争力所在,并集中资源投入。

这是DDD中最重要的战略模式。它明确地界定了一个模型的应用范围,即“在哪个边界内,这个词是什么意思”。例如,“产品”在电商的商品上下文中,拥有价格、描述、类目等属性;而在物流上下文中,“产品”则更关注重量、体积。
每个限界上下文都是一个独立的“语义疆界”,其内部拥有统一的通用语言和领域模型。系统因此被分解为多个高内聚、低耦合的模块。
关键原则:限界上下文通过上下文映射(Context Map)明确与其他上下文的关系,避免模型污染。

DDD与微服务架构天然契合。一个设计良好的限界上下文,天然就是一个微服务的候选者。反之,盲目地按照技术层次拆解系统,极易导致分布式单体——服务虽拆,耦合依旧。在微服务架构中,一个服务应该不小于一个聚合,不大于一个限界上下文。
在限界上下文内部,DDD提供了一系列战术建模工具来构建领域模型。
实体是具有唯一标识和生命周期的对象。例如,一个用户即使更改了姓名,其唯一ID不变,它依然是同一个实体。实体通常采用充血模型,即把业务行为封装在实体内部。
值对象没有唯一标识,仅通过其属性值来区分,通常不可变。例如,金额(Money)由币种和数值决定,两个金额和币种相同的Money可以互换。合理使用值对象可以减少系统复杂性,例如地址、邮箱、电话号码等均可建模为值对象。
聚合是一组相关实体和值对象的集合,它们作为整体被管理。聚合根是聚合中的核心实体,负责维护聚合内的一致性。例如,Order聚合根管理OrderItem和Payment实体,所有对订单项的访问都必须通过Order进行。
聚合设计原则:聚合边界内的事务应保持一致,引用其他聚合时应仅通过标识,避免跨聚合的直接引用。聚合应设计得尽可能小。
这是初学者最容易混淆的概念。领域服务承载无法归属到实体或值对象的领域行为,属于领域层,保持领域纯度,不涉及技术细节。例如,TransferService处理跨账户转账,它不属于任何一个账户实体,但又是核心业务逻辑。
应用服务协调领域对象和领域服务,处理应用程序的工作流程,属于应用层。应用服务是无状态的,负责用例的调度、事务管理和安全认证,但不包含业务规则。
仓储(Repository) 是领域层与基础设施层的桥梁,定义在领域层作为抽象接口,基础设施层实现具体存储逻辑。仓储只暴露按聚合访问的方法,不暴露ORM细节。
领域事件(Domain Event) 是领域内发生的有意义的业务事件,可以用来触发后续的业务逻辑,实现模块间的解耦。

DDD推荐采用分层架构,典型分为四层:用户接口层、应用层、领域层和基础设施层。
负责与用户交互,接收请求并返回响应。在Web应用中对应Controller,但仅负责参数校验和结果格式化,不包含业务逻辑。
协调领域对象完成业务用例,处理事务边界、安全和认证。应用层服务保持无状态,只调用领域服务或聚合根方法,不包含业务规则。
DDD的核心,包含所有业务规则和模型。定义聚合根、实体、值对象和领域服务,确保业务逻辑的完整性。
提供技术实现支持,如数据库访问、消息队列、外部API调用等。通过依赖倒置原则,领域层定义接口,基础设施层实现它们,实现业务逻辑与技术实现的彻底隔离。
DDD分层架构的依赖方向是由外向内:用户接口层依赖应用层,应用层依赖领域层,基础设施层通过依赖倒置被领域层定义接口。领域层不依赖任何具体框架或技术,这使得核心业务逻辑可以在不修改的情况下替换技术方案。

在DDD落地实践中,可视化是帮助团队建立共识的关键环节。无论是战略设计阶段的限界上下文划分,还是战术设计阶段的领域模型构建,都离不开清晰的图表。而ProcessOn作为专业的在线图表工具,可以高效地支持DDD架构的全流程可视化。
1. 进入ProcessOn个人文件页,创建“流程图”,或者直接在模板社区搜索DDD架构设计等关键词;
2. 左侧“更多图形”可以选择流程图、UML图等图形类别添加到图形库,图形库拖拽矩形框、圆形等图形到画布,用带箭头的连线可以链接不同元素表达依赖关系;
3. 选中单个或多个元素,顶部工具栏可以用不同颜色区分不同层次的模型,以及进行图形对齐、图层设置等布局;

4. 绘制完成后,可以点击右上角分享协作将DDD架构图分享给同事或客户持续迭代模型,也可以导出高清图片、PDF、SVG等格式留存。
领域驱动设计不只是一套技术模式或架构规范,它更是一场思维革命,和一套应对软件核心复杂性的系统化方法论。它教导我们:软件开发不是从建表开始,而是从理解业务开始。
通过战略设计划定领域边界,通过战术设计构建高内聚的领域模型,结合分层架构实现业务逻辑与技术实现的隔离,DDD能够显著提升复杂业务系统的可维护性和可扩展性。尤其是在微服务时代,DDD提供的限界上下文划分方法,正是科学拆分微服务的最佳实践。