CQRS & Event Sourcing 方式来处理需要生成多个命令的单个请求

CQRS & Event Sourcing way to handle a single request that needs to generate multiple commands

我正在制作一个家谱应用程序,因为我正在尝试学习事件溯源和 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。

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

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

决定的点不是一个人或一个家庭。就是教会。公制书是合计。当牧师做出决定时,他会将其记录在一本公制簿中。其他一切 - 人的文件、家谱、人的事实列表 - 都只是注册限界上下文中的读取模型。

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