当聚合完成更新以触发事件时,我应该如何建模 'knowing'?

How should I model 'knowing' when an aggregate is finished being updated to trigger an event?

聚合 B 具有需要与聚合 A 最终一致的计算。聚合 A 可以使用八种方法进行突变,每种方法都会导致 B 需要更新。看似最终一致的任务,但实际更新时间应该在几秒内。

不想依赖应用层来'remember'触发更新。 (还有 Jimmy Bogard says this。)对此建模的最佳方法是什么?

  1. 使用双重分派的域服务很痛苦:

    • 服务必须是 A
    • 上每个方法的参数
    • 通常会连续调用多个变异方法,我不想在每次调用方法时都在 B 中触发更新。
  2. 构造函数注入也很痛苦:

    • 有些情况下 A 没有发生变化,因此被迫实例化并注入域服务以监视肯定不会发生的变化感觉不对。
    • 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在 B 中触发更新。
  3. 域事件听起来不错,但我不确定它看起来像什么。每个变异方法都会引发一个领域事件?

    • 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在 B 中触发更新。

如何在 A 完成更新并知道它是否已更新时对 'knowing' 进行建模,以便我可以在不依赖应用程序层的情况下触发 B 的更新每次都按特定顺序调用方法?

或者这真的是存储库级别或应用程序级别的问题,即使它似乎是域要求?

你的数字 3. 很常用,也是很straight-forward的技巧:

  1. 在模型 A 更新时引发领域事件 AChangedType1,...,AChangedTypeN
  2. 让 saga/process 经理监听 AChangedTypeX 并发出相应的 UpdateBTypeX 命令。

它是松散耦合的(现在 A 和 B 都不是彼此)并且扩展性很好(易于并行化),并且它们之间的关系在漫长的 运行 过程中明确建模。

如果您不想在 A 的每次更改时触发对 B 的更新,那么您可以在发送 UpdateBTypeX 命令之前延迟更新一段时间(因为它通常在网络协议,参见 TCP's delayed acks.