【问题标题】:CQRS & Event Sourcing way to handle a single request that needs to generate multiple commands处理需要生成多个命令的单个请求的 CQRS 和事件溯源方式
【发布时间】:2021-01-26 13:12:26
【问题描述】:

在尝试学习事件溯源和 CQRS 时,我正在制作家谱应用程序。我的应用程序中有三个聚合:PersonAggregate、FactAggregate、FamilyAggregate。 我从 UI 到服务器的请求为一个人添加配偶是:

{
  personId: "", // And Existing Person in the DB
  personInput: {name: "Bob", birthDate: ""} // Input to create a new person in the DB
}

My Family Aggregate 监听 PersonAggregate 中的 PersonCreated 事件,以记录所有已创建的人。

UI 调用 PersonAggregate 来创建人(使用有关它的数据需要在两个人之间创建伙伴关系而不是调用 FamilyAggregate),然后在 PersonCreated 事件上将 FamilyAggregate 需要知道的数据添加为配偶吗?或者这是一个糟糕的设计,因为现在 Event 中有命令数据?

创建一个人时,Person Aggregate 还需要将数据发送到 FactAggregate 以创建有关此人生日的 Fact。

【问题讨论】:

    标签: domain-driven-design cqrs event-sourcing


    【解决方案1】:

    需要在单个事务中更新多个聚合表明聚合边界是错误的。因为根据定义,聚合负责保护事务边界。并且单个事件对应单个事务。

    让我们考虑如何在非计算机世界中处理这种情况。业务领域在那里设计得很好。经过几个世纪的磨砺,使其变得尽可能强大和简单。

    决定的重点不是一个人或一个家庭。它是教会。度量书是汇总。当一个牧师做出决定时,他会把它写进一本度量书。其他一切——人的文件、家谱、人的事实清单——都只是注册有界上下文中的读取模型。

    它们可以是其他有界上下文中的聚合。并且有些服务可能会在原始事务完成并写入事件后监听注册事件并更新相关实体。最终。

    【讨论】:

    • 因此,在该示例中,可能有一个 Metrical Service 被调用并记录MarriageRegistered 或NewPersonRegsitered。然后 Person 服务会监听它并记录它需要的数据,然后一个家庭会监听一个已注册的婚姻以将两人记录为已婚?
    • 是这样的。 PersonNameGiven 和 PersonDied,可能。然后家谱服务可以将数据存储在图形表示中,并有效地回答有关一个人的家谱的查询。但是,Person 服务会回答哪些问题呢?另一个问题是:牧师在记录之前对数据进行了哪些验证? IE。应该验证什么。
    • 可能在家谱服务中可以检查一个人只能添加与他相关的人的记录...
    • 但这是否意味着 Metrical Service 必须验证传入的出生和死亡事件是否有效?或者 PersonName 是否是有效输入?什么时候应该分别在人和事实边界?
    • 什么是有效的出生事件?无论如何,这个事件应该开始一个人的存在。至于死亡事件——可以证实,只有那些已经出生的人才会死去。并且不应允许此人的其他事件。然后可以从这些记录中重建任何人(或任何人的生活事实)。一个人可以通过全名、出生日期和出生地点来识别。度量服务还可以验证重复的出生事件。
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2020-07-12
    • 2019-01-31
    • 2019-12-16
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多