聚合对相关的业务对象进行分组,而聚合根(AR) 是该聚合的“代表”。AR 本身是对(更大、更复杂)领域概念进行建模的实体。在 DDD 中,模型总是相对于上下文(有界上下文 - BC),即该模型仅在该 BC 中有效。
这允许您定义一个代表特定业务上下文的模型,并且您不需要将所有内容都放在一个模型中。订单在一种情况下是 AR,而在另一种情况下只是 id。
由于 AR 几乎封装了所有较低的概念和业务规则,因此它作为一个整体发挥作用,即作为一个事务/工作单元。存储库始终与 AR 一起使用,因为 1) 存储库始终处理业务对象,并且 2) AR 代表给定上下文的业务对象。
当您有一个涉及 2 个或更多 AR 的用例时,业务工作流程和该用例的正确建模至关重要。在很多情况下,这些 AR 可以独立修改(一个人不关心其他人),或者 AR会因其他 AR 行为而改变。
在您的示例中,这非常简单:当客户订购 100 件商品时,会生成并发布一个域事件。然后你有一个处理程序,它将检查订单是否符合客户促销规则,如果符合,则会发出一个命令,结果会将客户状态更改为 VIP。
领域事件非常强大,允许您在最终一致的环境中实现事务。旧的 db 事务是一个实现细节,通常在持久化一个 AR 时使用(记住 AR 被视为一个逻辑单元,但持久化一个可能涉及多个表,因此是 db 事务)。
最终一致性是领域事件的“特征”,它自然适合丰富的领域(实际上是现实世界)。在某些情况下,您可能需要即时一致性,但这些是特殊情况,它们与 UI 相关,而不是域的工作方式。当然,它确实取决于一个域到另一个域。在您的示例中,客户不会介意在下订单后 2 秒或 2 分钟而不是同一毫秒成为 VIP。