【问题标题】:how to update two aggregate in a transaction with using an event如何使用事件更新事务中的两个聚合
【发布时间】:2021-05-09 15:43:13
【问题描述】:

为了澄清,我简化了我的问题。我使用了 DDD 方法和 CQRS 模式。 在我的应用程序中,我有 2 个聚合用户和联系人,并且有两个入口点来添加用户或联系人。一切都很好,直到我的客户说我需要一个新的 API 入口点来同时添加用户和联系人。

我为他们两个都写了一个新命令,但发现我不能将一个命令用于一个以上的任务并且必须使用事件。另一方面,在 DDD 方法中,聚合根可以引发事件。在这种情况下,由用户引发事件是没有意义的,因为它不知道联系人。

在我看来,应用层负责引发事件。此外,如何将它们都保留在事务中以及如何将 UserId 发送到联系人命令。我很困惑如何解决它。


我想知道您是否可以为我提供解决方案或解决方法。 谢谢。

【问题讨论】:

    标签: events transactions aggregate domain-driven-design cqrs


    【解决方案1】:

    聚合不应与其他聚合对话,只有命令会触发聚合的更改。另一种方法是使用一些 saga/process manager 来监听事件并针对其他聚合发出命令。

    我会继续使用两个命令,而不是在用户界面中“伪造”作为一种选择。

    但是问题是什么是用户?什么是联系人?用户是可以登录的人吗?还是客户用户?你真的会同时创建用户和联系人吗?

    【讨论】:

    • 感谢您的建议。你说,我做了一个假命令并发布一条带有两个请求(添加用户,添加联系人)的消息,然后是传奇管理命令。在实际项目中,用户是参与方聚合(演员或角色、身份、联系人、地址),联系人是关系聚合。
    • 一个事务怎么办我可以更新事务中的两个命令还是违反聚合规则。
    • 不,每个命令只能更新一个聚合,这是一个事务边界。我的意思是你的 UI 可以向后端发出两个命令,来满足客户的需求。 UI 可以发送多个命令,但您需要小心,因为如果一个命令失败而一个命令成功,您将遇到一些问题。通常,当您遇到这些问题时,这表明您的域建模错误。
    • 我不认为这个问题源于设计。由于数据量大,关系必须是单独的聚合。在某些情况下,每方的关系可能超过 10000。我认为最好还是坚持处理交易问题。最后,感谢您的时间和考虑。
    • 我也认为重要的是要意识到一些聚合不适合事件源,有时以关系方式存储会更好。您仍然可以使用经典的关系数据库进行命令/查询和 CQRS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多