假设我正在使用C#和实体框架实现领域驱动设计。
我的代码的结构使得每个聚合在 EF 中都有自己的数据库上下文,以尊重聚合周围的事务边界原则。
聚合 1(库存聚合)和聚合 2(订单聚合)正在由某个业务流程 AddItemToOrder 进行更新。
在 OrderAggregate 添加项目后,它会触发一个域事件 ItemAddToOrder,该事件由 InventoryAggregate 侦听,然后执行一些业务流程 SubQuantityFromInventory。
InventoryAggregate 无法减去库存,并触发一个域事件 NotEnoughInventory,由 OrderAgrated 侦听。
然后,OrderAggregate 尝试从订单中删除该项目,但失败。
现在订单中有一件商品不应该是,因为我们实际上没有足够的库存来销售该商品。
应该如何处理?
你描述的是一个进程管理器。 您可能需要某种OrderProcess
或QuoteProcess
AR 来处理进程的状态。 如果您需要执行一些业务验证,例如首先检查库存,那么您需要有一个流程管理器,以便只有在确定确实可以提交后才能创建实际Order
。
关于如何处理某些项目的规则可能不像删除项目那么简单,即使在您的情况下,这可能是您需要做的。 您可能需要向用户显示一个或多个选项的数据。 一种可能是在提交订单之前删除该商品,另一种可能是将其放在延期交货的订单上。