从CQRS中的2个不同聚合访问相同的数据

时间:2011-07-07 21:02:25

标签: domain-driven-design cqrs

我正在阅读CQRS并且喜欢这个概念,但发现它与“正常”开发有点不同。我找到了一个“问题”,我没有找到任何关于如何实施的好例子。这就是我如何从2个不同的聚合根中访问“相同的数据”。我理解它的方式是我将aggregateroot和它的值序列化到写入数据库,然后我永远无法从2个不同的聚合器中获取“相同的数据”。

这是我的意思的一个例子。

因此,如果我有一个网店并且我销售一件物品,我将会删除该产品的ItemsInStock,因此在我的网页上我可以显示库存中有多少或者是否必须在交付给客户之前订购。

所以该产品将成为一个聚合器,因为我可以向它发送命令,如RefillStockCommand(int number)。我将拥有的另一个聚合器是订单,它将有一个SendCommand(),将订单发送给客户等等,你得到的图片。

当我执行SendCommand()时,我想减少订单中所有产品的ItemsInStock状态,如果其中一些产品已达到低于5,我想从我的零售商那里订购更多此产品。所以我在Orderaggregateroot中加载我的产品聚合物是否可以?如果我可以这样做,那么我获取我的产品的数据,并在SendCommand()中更改我的产品的ItemsInStock状态,但是可以访问另一个聚合器内的聚合器,这听起来是错误的,但如果不是,我该如何更改1个命令中的2个聚合根,并使用另一个聚合器根中的一个聚合数据进行业务验证?

祝你好运 马格纳斯格拉德

1 个答案:

答案 0 :(得分:0)

快速流程将是这样的:

在Ordergin / Biling有界上下文中:

您有一个CreateOrder命令可以创建订单。因此,将发布OrderCreatedEvent。

在您的库存/产品管理有界背景中:

您有事件处理程序订阅了OrderCreatedEvent,它将直接告诉每个产品减少ItemsInStock或者为每个产品发送命令。

更改CreateOrder事务边界内的产品的ItemsInStock的问题是,如果由于某种原因更改库存中的商品失败(例如变为负数),您的订单创建也将失败,这可能不是您想要的。

这与域建模和DDD有关,而不是与CQRS有关。