【问题标题】:Access same data from 2 diffrent aggregates in CQRS从 CQRS 中的 2 个不同聚合访问相同的数据
【发布时间】:2011-07-07 21:02:24
【问题描述】:

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

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

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

所以产品将是一个聚合根,因为我可以向它发送命令,例如 RefillStockCommand(int number)。我将拥有的另一个聚合根是 Order,它将有一个 SendCommand(),它将订单发送给客户等,你明白了。

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

最好的问候 马格努斯·格拉德

【问题讨论】:

    标签: domain-driven-design cqrs


    【解决方案1】:

    一个快速的流程是这样的:

    在您的 Ordergin/Biling 有界上下文中:

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

    在您的库存/产品管理有界上下文中:

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

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

    这与域建模和 DDD 的关系比与 CQRS 的关系更大。

    【讨论】:

    • 好的。因此,如果我想做像我的示例这样的事情,我会使用这些事件来启动其他聚合根中的代码。听起来不错,看起来很干净。感谢您的回答。
    猜你喜欢
    • 2022-03-21
    • 2011-03-27
    • 1970-01-01
    • 2019-08-13
    • 2023-03-27
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多