2. 核心概念回顾
在深入支付订单的聚合建模之前,必须统一团队对领域驱动设计(DDD)战术模式中五个核心概念的理解。这些概念是划分服务边界、设计通信机制的基础构件。以下从定义、判别标准、在支付场景中的映射三个维度进行回顾。
2.1 实体(Entity)
实体是具有唯一标识符且在其生命周期内状态可变的领域对象。两个实体即便所有属性值相同,只要标识符不同,就是不同的对象。
- 标识稳定性:一旦创建,标识不可变更(如订单ID、用户ID)。
- 可变性:属性值可以随时间变化(如订单状态从“待支付”变为“已支付”)。
- 相等性:通过标识符判断相等,而非属性值。
支付场景映射:
PaymentOrder(支付单)、PaymentTransaction(支付交易流水)、Account(账户)都是典型的实体。每个支付单拥有全局唯一的支付单号,状态随支付流程推进而变化。
2.2 值对象(Value Object)
值对象通过属性值来定义自身,没有唯一标识符,且通常是不可变的。两个值对象如果所有属性值相同,则视为同一个对象。
- 无标识:不分配ID,仅描述实体的某个特征。
- 不可变性:创建后不允许修改;需要变更时直接替换整个值对象。
- 可共享性:相同值对象可以在多个实体间安全共享。
| 对比维度 | 实体(Entity) | 值对象(Value Object) |
|---|---|---|
| 标识 | 有唯一标识 | 无标识 |
| 可变性 | 可变 | 不可变 |
| 相等性判断 | 通过标识符 | 通过所有属性值 |
| 生命周期 | 独立生命周期 | 依附于实体 |
| 支付示例 | 支付单、账户 | 金额、货币、地址、支付方式快照 |
设计原则:优先使用值对象描述实体的属性,减少实体数量,降低聚合内部的复杂度。例如,
Money(金额+币种)作为值对象,比拆分为两个基本类型字段更安全、更内聚。
2.3 聚合(Aggregate)与聚合根(Aggregate Root)
聚合是一组相关对象的集群,外部只能通过聚合根访问集群内部的对象。聚合根是聚合中唯一允许被外部引用的实体。
- 一致性边界:聚合保证内部对象在业务操作后始终满足不变量。
- 原子性:对聚合的任何修改都必须通过聚合根,且在一个事务内完成。
- 引用规则:外部对象只能持有聚合根的ID,不能持有内部实体的引用。
常见误区:将数据库表的一对多关系直接映射为聚合关系。聚合边界应由业务一致性决定,而非数据关联。例如,支付单与其关联的退款单可能分属不同聚合,因为退款有独立的不变量和生命周期。
以下SVG图展示了聚合的内部结构与外部访问规则:
2.4 领域事件(Domain Event)
领域事件是聚合中发生的、对领域专家有意义的业务事实的记录。它用于在聚合之间或限界上下文之间传递状态变更通知,实现最终一致性。
- 不可变性:事件一旦发布,内容不可修改。
- 命名规范:使用过去时态动词,如
PaymentCompleted、RefundInitiated。 - 包含信息:事件ID、发生时间戳、聚合根ID、业务关键数据。
支付场景典型事件链:
每个事件都代表支付单生命周期中的一个里程碑,下游服务(如账务、通知、风控)通过订阅这些事件触发各自的业务逻辑。
PaymentOrderCreated → PaymentProcessingStarted → PaymentAuthorized → PaymentCaptured → PaymentCompleted每个事件都代表支付单生命周期中的一个里程碑,下游服务(如账务、通知、风控)通过订阅这些事件触发各自的业务逻辑。
以下SVG图展示了领域事件在聚合间通信中的角色:
2.5 概念关系总结
| 概念 | 核心特征 | 支付领域典型示例 | 设计关注点 |
|---|---|---|---|
| 实体 | 有ID、可变、通过ID相等 | PaymentOrder, Account, Merchant | 标识生成策略、状态机设计 |
| 值对象 | 无ID、不可变、通过值相等 | Money, Currency, Address, CardInfo | 不变性保证、工厂方法 |
| 聚合 | 一致性边界、事务原子性 | 支付单聚合(含交易流水、金额) | 边界划分、不变量定义 |
| 聚合根 | 唯一外部入口、全局标识 | PaymentOrder(聚合根) | 全局ID、仓储接口 |
| 领域事件 | 不可变、过去时、携带业务数据 | PaymentCompleted, RefundApproved | 事件命名、发布时机、订阅者幂等 |
建模口诀:
实体有ID可变样,值对象无ID不可换。
聚合边界保一致,聚合根是唯一门。
领域事件记事实,解耦通信靠它传。
实体有ID可变样,值对象无ID不可换。
聚合边界保一致,聚合根是唯一门。
领域事件记事实,解耦通信靠它传。