如何处理 DDD 中聚合之间最终一致性的失败?

How to handle failures in eventual consistency between aggregates in DDD?

假设我正在使用 C# 和 Entity Framework 实现领域驱动设计。

我的代码结构使得每个聚合在 EF 中都有自己的 dbcontext,以遵守我的聚合周围事务边界的原则。

聚合 1 InventoryAggregate 和聚合 2 OrderAggregate 正在由某个业务流程 AddItemToOrder 更新。

在 OrderAggregate 添加项目后,它会触发域事件 ItemAddedToOrder,InventoryAggregate 会侦听该事件,然后 InventoryAggregate 会执行一些业务流程 SubtractQuantityFromInventory。

InventoryAggregate 无法减去库存,它会触发域事件 NotEnoughInventory,由 OrderAggregate 侦听。

OrderAggregate 然后尝试从订单中删除项目但失败了。

现在订单中有一件商品不应该是因为我们实际上没有足够的库存来销售该商品。

应该如何处理?

您描述的是 流程管理器。您可能需要某种 OrderProcessQuoteProcess AR 来为您处理状态。如果您需要先执行一些业务验证,例如检查库存,那么您需要有一个流程管理器,以便您只在确定确实可以提交后才创建实际的 Order

关于如何处理某些项目的规则可能不像删除项目那么简单,即使在您的情况下,这可能是您需要做的。您可能需要通过一个或多个选项将数据呈现给用户。一个可能是在提交订单之前移除该项目,而另一个可能是将其置于未交货订单中。