Skip to content

领域驱动设计核心概念详解

本文系统梳理DDD战术设计中的核心概念,帮助开发者从0到1理解并落地DDD。


一、领域(Domain)

领域是软件系统所要解决的业务问题范围,是现实世界的业务活动映射到软件系统的边界。

可以这么理解:一个医院管理系统的领域就是医疗业务,包括挂号、诊断、开药、住院等所有医院相关的业务活动;而电商系统的领域就是在线购物,包括商品浏览、下单、支付、物流等。

领域具有层次结构:

  • 核心域:业务的核心竞争力,如电商的交易系统
  • 支撑域:支持核心业务的系统,如用户管理、权限系统
  • 通用域:多个系统共用的功能,如日志、通知服务

二、限界上下文(Bounded Context)

限界上下文是对领域模型的边界划分,每个上下文内部有一套完整的领域模型,不同上下文之间通过明确的接口进行交互。

就像一个大公司分为不同的部门:

  • 订单上下文:处理订单相关的所有业务
  • 库存上下文:管理商品库存
  • 支付上下文:处理支付相关业务

每个部门都有自己的"语言"和"规则",部门之间通过标准接口协作,这就是限界上下文的核心思想。

限界上下文的特点:

  • 统一语言:上下文内部使用一致的领域术语
  • 模型独立:每个上下文可以有自己的领域模型设计
  • 边界清晰:通过接口明确与其他上下文的交互方式

三、实体(Entity)

实体是具有唯一标识的领域对象,其标识在生命周期内保持不变,即使属性发生变化也能被唯一识别。

就像身份证一样:

  • 身份证号码是实体的唯一标识,终身不变
  • 姓名、住址、婚姻状态等属性可以改变
  • 但身份证号码始终标识着同一个人

实体特征

  • 具有唯一标识(ID)
  • 具有生命周期(可创建、修改、删除)
  • 通过ID而非属性来区分不同实例
  • 包含业务行为和业务规则

四、值对象(Value Object)

值对象是描述事物特征的领域对象,它没有唯一标识,通过属性值来区分。

就像餐厅选座:

  • 作为顾客,我们并不关心坐的是几号桌
  • 只关心桌子是否空着、是否靠窗、能坐几个人
  • 桌子的"属性"(位置、容量、状态)才是我们关心的

值对象特征

  • 无唯一标识,通过属性值区分
  • 不可变(Immutable)
  • 可共享和复用
  • 通常作为实体的属性存在

示例:用户地址、货币金额、坐标点等都是典型的值对象。


五、聚合(Aggregate)

聚合是一组具有内聚关系的实体和值对象的集合,它们共同完成特定的业务功能。

就像公司的组织架构:

  • 研发部门(聚合)包含:程序员(实体)、项目经理(实体)、办公工位(值对象)
  • 销售部门(聚合)包含:销售人员(实体)、客户信息(实体)、销售目标(值对象)

每个聚合都有明确的业务边界和职责。


六、聚合根(Aggregate Root)

聚合根是聚合的入口点和协调者,外部系统只能通过聚合根来访问聚合内部的对象。

就像部门负责人:

  • 外部人员要联系部门成员,必须通过部门负责人
  • 负责人协调部门内部的工作,确保业务规则不被破坏
  • 负责人代表整个部门对外交互

聚合根职责

  • 维护聚合的业务规则一致性
  • 控制聚合内对象的生命周期
  • 作为聚合的唯一外部访问入口
  • 协调聚合内对象完成业务操作

七、领域服务(Domain Service)

领域服务是处理跨聚合业务逻辑的服务,当单个聚合无法完成某个业务操作时,由领域服务协调多个聚合共同完成。

就像跨部门协作:

  • 一个"员工入职"流程需要人力资源部、IT部门、财务部协作
  • 这种跨部门的复杂流程需要一个"协调者"来统筹安排
  • 这个协调者就是领域服务

使用场景

  • 涉及多个聚合的业务操作
  • 不适合放在任何单个聚合中的业务逻辑
  • 需要协调多个聚合根完成的工作

八、领域事件(Domain Event)

领域事件是领域中发生的有业务意义的事件,用于在不同聚合或限界上下文之间传递信息。

就像公司公告:

  • "新员工入职完成"是一个事件
  • 财务部收到后创建工资账户
  • IT部门收到后开通系统权限
  • 各部门根据事件做出相应反应

领域事件特征

  • 表示已发生的事实(过去时)
  • 包含事件相关的业务数据
  • 可用于实现最终一致性
  • 支持事件溯源(Event Sourcing)

九、仓储(Repository)

仓储是聚合的持久化机制,负责聚合的存储、检索和删除操作。

就像档案室:

  • 负责保存和查找员工档案(聚合)
  • 提供标准的存取接口
  • 隐藏具体的存储细节(数据库、文件系统等)

仓储职责

  • 提供聚合的持久化服务
  • 封装数据访问细节
  • 维护聚合的完整性
  • 支持查询和检索操作

十、工厂(Factory)

工厂是创建复杂聚合和实体的机制,封装对象创建的业务逻辑。

就像入职流程:

  • 新员工入职需要创建员工档案、分配工号、设置权限等
  • 这个复杂的创建过程由"入职专员"(工厂)统一处理
  • 确保创建过程符合业务规则

工厂使用场景

  • 聚合创建过程复杂
  • 需要确保业务规则在创建时就被满足
  • 隐藏创建细节,提供统一的创建接口

概念关系总结

概念核心特征类比示例主要职责
领域业务问题范围医院的医疗业务定义系统边界
限界上下文领域模型的边界划分公司的不同部门维护模型一致性
实体有唯一标识身份证承载业务行为和状态
值对象无标识,通过值区分餐厅座位属性描述事物特征
聚合实体和值对象的集合公司部门完成特定业务功能
聚合根聚合的入口和协调者部门负责人维护聚合一致性
领域服务跨聚合业务逻辑跨部门协调员协调多个聚合
领域事件有业务意义的事件公司公告实现松耦合通信
仓储聚合持久化机制档案室数据存储和检索
工厂复杂对象创建机制入职专员封装创建逻辑

学习建议

  1. 从实际业务出发:先理解业务,再抽象概念
  2. 小步实践:从一个限界上下文开始,逐步扩展
  3. 统一语言:与业务专家一起建立通用语言
  4. 持续重构:DDD是一个演进过程,不是一次性设计

建议下一步学习:事件风暴(Event Storming)建模方法,通过工作坊形式与业务专家一起梳理业务流程和领域模型。