当聚合完成更新以触发事件时,我应该如何建模 '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。)对此建模的最佳方法是什么?
使用双重分派的域服务很痛苦:
- 服务必须是
A
上每个方法的参数
- 通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
构造函数注入也很痛苦:
- 有些情况下
A
没有发生变化,因此被迫实例化并注入域服务以监视肯定不会发生的变化感觉不对。
- 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
域事件听起来不错,但我不确定它看起来像什么。每个变异方法都会引发一个领域事件?
- 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
如何在 A
完成更新并知道它是否已更新时对 'knowing' 进行建模,以便我可以在不依赖应用程序层的情况下触发 B
的更新每次都按特定顺序调用方法?
或者这真的是存储库级别或应用程序级别的问题,即使它似乎是域要求?
你的数字 3. 很常用,也是很straight-forward的技巧:
- 在模型 A 更新时引发领域事件
AChangedType1
,...,AChangedTypeN
- 让 saga/process 经理监听
AChangedTypeX
并发出相应的 UpdateBTypeX
命令。
它是松散耦合的(现在 A 和 B 都不是彼此)并且扩展性很好(易于并行化),并且它们之间的关系在漫长的 运行 过程中明确建模。
如果您不想在 A 的每次更改时触发对 B 的更新,那么您可以在发送 UpdateBTypeX
命令之前延迟更新一段时间(因为它通常在网络协议,参见 TCP's delayed acks.
聚合 B
具有需要与聚合 A
最终一致的计算。聚合 A
可以使用八种方法进行突变,每种方法都会导致 B
需要更新。看似最终一致的任务,但实际更新时间应该在几秒内。
不想依赖应用层来'remember'触发更新。 (还有 Jimmy Bogard says this。)对此建模的最佳方法是什么?
使用双重分派的域服务很痛苦:
- 服务必须是
A
上每个方法的参数
- 通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
- 服务必须是
构造函数注入也很痛苦:
- 有些情况下
A
没有发生变化,因此被迫实例化并注入域服务以监视肯定不会发生的变化感觉不对。 - 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
- 有些情况下
域事件听起来不错,但我不确定它看起来像什么。每个变异方法都会引发一个领域事件?
- 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在
B
中触发更新。
- 同样,通常会连续调用多个变异方法,我不想在每次调用方法时都在
如何在 A
完成更新并知道它是否已更新时对 'knowing' 进行建模,以便我可以在不依赖应用程序层的情况下触发 B
的更新每次都按特定顺序调用方法?
或者这真的是存储库级别或应用程序级别的问题,即使它似乎是域要求?
你的数字 3. 很常用,也是很straight-forward的技巧:
- 在模型 A 更新时引发领域事件
AChangedType1
,...,AChangedTypeN
- 让 saga/process 经理监听
AChangedTypeX
并发出相应的UpdateBTypeX
命令。
它是松散耦合的(现在 A 和 B 都不是彼此)并且扩展性很好(易于并行化),并且它们之间的关系在漫长的 运行 过程中明确建模。
如果您不想在 A 的每次更改时触发对 B 的更新,那么您可以在发送 UpdateBTypeX
命令之前延迟更新一段时间(因为它通常在网络协议,参见 TCP's delayed acks.