Appearance
领域驱动设计核心概念详解
本文系统梳理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)
工厂是创建复杂聚合和实体的机制,封装对象创建的业务逻辑。
就像入职流程:
- 新员工入职需要创建员工档案、分配工号、设置权限等
- 这个复杂的创建过程由"入职专员"(工厂)统一处理
- 确保创建过程符合业务规则
工厂使用场景:
- 聚合创建过程复杂
- 需要确保业务规则在创建时就被满足
- 隐藏创建细节,提供统一的创建接口
概念关系总结
概念 | 核心特征 | 类比示例 | 主要职责 |
---|---|---|---|
领域 | 业务问题范围 | 医院的医疗业务 | 定义系统边界 |
限界上下文 | 领域模型的边界划分 | 公司的不同部门 | 维护模型一致性 |
实体 | 有唯一标识 | 身份证 | 承载业务行为和状态 |
值对象 | 无标识,通过值区分 | 餐厅座位属性 | 描述事物特征 |
聚合 | 实体和值对象的集合 | 公司部门 | 完成特定业务功能 |
聚合根 | 聚合的入口和协调者 | 部门负责人 | 维护聚合一致性 |
领域服务 | 跨聚合业务逻辑 | 跨部门协调员 | 协调多个聚合 |
领域事件 | 有业务意义的事件 | 公司公告 | 实现松耦合通信 |
仓储 | 聚合持久化机制 | 档案室 | 数据存储和检索 |
工厂 | 复杂对象创建机制 | 入职专员 | 封装创建逻辑 |
学习建议
- 从实际业务出发:先理解业务,再抽象概念
- 小步实践:从一个限界上下文开始,逐步扩展
- 统一语言:与业务专家一起建立通用语言
- 持续重构:DDD是一个演进过程,不是一次性设计
建议下一步学习:事件风暴(Event Storming)建模方法,通过工作坊形式与业务专家一起梳理业务流程和领域模型。