交叉聚合引用:命令处理程序可以在聚合 ID 集合之间循环,还是事件处理程序可以分派命令?

Cross aggregate references: Can a command handler loop among a collection of aggregate ids, or can event handlers dispatch commands?

我需要从多个集合持有的集合中删除一个 id。 假设我有一个 EmployeeAggregate,其中包含一个 Hobbies'id 集合。 聚合是事件来源的。

让我们说在应用程序的某个地方,某人在一个处理爱好的基本 crud 应用程序中 table,删除了一个爱好行。我怎样才能反映所有 EmployeeAggregates 的变化?

现在在事件存储中我有关于 EmployeeAggregate 的事件,关于 Hobbies 的事件(使用 HobbieWasDeletedEvent),但是没有什么可以让 EmployeeAggregate 处理这个 HobbieWasDeletedEvent。

我能做什么的一些想法:

[编辑]

一种方法是使用 saga/process 模拟两阶段提交来管理以下过程:

分配爱好

  • 用户向 Employee 集合发出 AssignHobby 命令。引发 HobbyAssigned 事件。
  • Saga 收到 HobbyAssigned 并向 Hobby 集合发出 AddEmployee 命令。
    • 如果 Hobby 处于活动状态,则会引发 EmployeeAdded 事件
    • 如果 Hobby 处于非活动状态,则会引发 EmployeeNotAdded 事件
  • Saga 接收到 EmployeeNotAdded 事件并向 Employee 集合发出 RemoveHobby 命令。引发 HobbyRemoved 事件。
    • 根据不让员工有闲置爱好的重要性,您也可以在此步骤中引入两阶段提交,例如首先请求添加 Hobby,一旦 Hobby 批准,您就可以与 Employee 完成请求。

删除爱好

  • 用户向 Hobby 集合发出停用命令。引发停用事件。
    • 从现在开始,Hobby 聚合将被标记为不活动。任何添加员工的请求都将导致 EmployeeNotAdded 事件。
  • Saga 收到 Deactivated 事件。它加载 Hobby 聚合并向分配给 Hobby 的每个 Employee 聚合发出 RemoveHobby 命令。每个都会引发一个 HobbyRemoved 命令。