Domain driven design 从CQR中的2个不同聚合访问相同的数据

Domain driven design 从CQR中的2个不同聚合访问相同的数据,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我正在阅读CQR和喜欢这个概念,但发现它与“正常”开发有点不同。我确实发现了一个“问题”,我还没有找到任何关于如何实现的好例子。这就是如何从两个不同的aggreates根访问“相同的数据”。我的理解是,我将aggregateroot及其值序列化到写入数据库,然后我永远无法从两个不同的aggregateroot中获得“相同的数据” 这是我的意思的一个例子 因此,如果我有一家网店,并且我出售了一件商品,我将降低该商品的库存,因此在我的网页上,我可以显示有多少库存,或者是否必须在交付给客户之前订购 因

我正在阅读CQR和喜欢这个概念,但发现它与“正常”开发有点不同。我确实发现了一个“问题”,我还没有找到任何关于如何实现的好例子。这就是如何从两个不同的aggreates根访问“相同的数据”。我的理解是,我将aggregateroot及其值序列化到写入数据库,然后我永远无法从两个不同的aggregateroot中获得“相同的数据”

这是我的意思的一个例子

因此,如果我有一家网店,并且我出售了一件商品,我将降低该商品的库存,因此在我的网页上,我可以显示有多少库存,或者是否必须在交付给客户之前订购

因此,该产品将是一个aggregateroot,因为我可以向它发送命令,比如RefillStockCommand(int number)。我将拥有的另一个aggregateroot是Order,它将有一个SendCommand(),它将订单发送给客户,等等,好的,您已经了解了

当我执行SendCommand()时,我希望降低订单中所有产品的ItemsInStock状态,并且如果其中一些产品的库存低于5,那么我希望从我的零售商处订购更多此类产品。那么我要在我的订单中加载我的产品聚合oot聚合oot可以吗?如果我能做到这一点,那么我会获取产品的数据,并在SendCommand()中更改产品的ItemsInStock状态,但是在另一个aggregateroot中访问aggregateroot可以吗听起来不对,但如果不是,我如何在1个命令中更改2个aggregatesroots,并在另一个aggregatesroots中使用一个aggregatesroots数据进行业务验证

致意
Magnus Gladh

快速流动如下:

在Ordergin/Biling绑定上下文中:

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

在您的库存/产品管理环境中:

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

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


这更多地与领域建模和DDD有关,而不是与CQR有关

好的。因此,如果我想做一些类似于我的示例的事情,我会使用事件来启动其他aggregateroot中的代码。听起来不错,看起来很干净。谢谢你的回答。