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

时间:2016-03-19 14:04:16

标签: c# entity-framework domain-driven-design eventual-consistency

让我们说我正在使用C#和实体框架实现域驱动设计。

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

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

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

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

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

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

应如何处理?

1 个答案:

答案 0 :(得分:1)

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

关于如何处理某些项目的规则可能不像删除项目那么简单,即使在您的情况下,它可能是您需要做的事情。您可能需要使用一个或多个选项向用户显示数据。一种可能是在提交订单之前删除该项目,而另一项可能是将其放在后面订单上。