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图展示了聚合的内部结构与外部访问规则:

聚合结构与访问规则 聚合边界(事务一致性) 聚合根:PaymentOrder orderId: String(全局唯一标识) 内部实体:PaymentTransaction transactionId(聚合内唯一) 值对象:Money amount + currency 值对象:PaymentMethod type + cardLastFour 外部实体:Account accountId: String 外部聚合:RefundOrder refundId: String 持有 orderId 引用 持有 orderId 引用 访问规则 • 外部只能通过聚合根ID引用 • 内部对象对外部不可见 • 修改必须通过聚合根方法

2.4 领域事件(Domain Event)

领域事件是聚合中发生的、对领域专家有意义的业务事实的记录。它用于在聚合之间或限界上下文之间传递状态变更通知,实现最终一致性。

  • 不可变性:事件一旦发布,内容不可修改。
  • 命名规范:使用过去时态动词,如 PaymentCompleted、RefundInitiated。
  • 包含信息:事件ID、发生时间戳、聚合根ID、业务关键数据。
支付场景典型事件链:
PaymentOrderCreated → PaymentProcessingStarted → PaymentAuthorized → PaymentCaptured → PaymentCompleted
每个事件都代表支付单生命周期中的一个里程碑,下游服务(如账务、通知、风控)通过订阅这些事件触发各自的业务逻辑。

以下SVG图展示了领域事件在聚合间通信中的角色:

领域事件驱动的聚合间通信 支付单聚合 PaymentOrder 状态:已支付 事件总线 / 消息队列 PaymentCompleted orderId, amount, time 账务聚合 更新账户余额 记录交易流水 通知聚合 发送支付成功消息 推送订单状态更新 风控聚合 发布事件 订阅 订阅 订阅

2.5 概念关系总结

概念 核心特征 支付领域典型示例 设计关注点
实体 有ID、可变、通过ID相等 PaymentOrder, Account, Merchant 标识生成策略、状态机设计
值对象 无ID、不可变、通过值相等 Money, Currency, Address, CardInfo 不变性保证、工厂方法
聚合 一致性边界、事务原子性 支付单聚合(含交易流水、金额) 边界划分、不变量定义
聚合根 唯一外部入口、全局标识 PaymentOrder(聚合根) 全局ID、仓储接口
领域事件 不可变、过去时、携带业务数据 PaymentCompleted, RefundApproved 事件命名、发布时机、订阅者幂等
建模口诀:
实体有ID可变样,值对象无ID不可换。
聚合边界保一致,聚合根是唯一门。
领域事件记事实,解耦通信靠它传。