仅用于更新投影的事件
Events only for updating projection
我们正在将事件溯源和重构引入到我们应用程序的一部分中的丰富域模型中,但我们对其中的一部分感到有些困惑。
我们有 Tank
s,它们是聚合根,我们经常收到关于这些 Thank
s 的 TankGauge
信息。由于历史计量信息与任何业务逻辑都不相关,因此聚合不包含所有计量的集合,它仅包含对最新计量的引用。
为了显示历史仪表,我们设置了一个投影。
现在我们收到请求:我们想更新历史仪表的备注。这唯一相关的是持有历史指标的预测。这会导致在聚合上应用 RemarkSetOnHistoricalGauge
事件基本上是空操作,只有投影会相应更新。
这可行,但感觉有点违反直觉。对这种方法有什么建议吗?
我会考虑你这里是否有两个限界上下文:
- 储罐计量上下文:使用
TankGauge
命令,验证它们是否有意义(如果你没有,那么拥有 Tank
聚合就没有意义)并发出 TankGaugeWas
(TankLevelWas
?) 事件
- 坦克历史背景:允许remarks/annotations关于历史水平
这两个都有坦克的概念,但不是同一个。历史上下文使用来自测量上下文的事件(从历史上下文的角度来看,这些事件成为命令,隐含地“将此事件纳入您的世界观”)。它们可以有不同的聚合逻辑:甚至可能值得将坦克历史聚合建模为 time-windowed,例如明天的储罐与今天的同一个储罐不是同一个聚合体(这样做的主要好处是您不必加载整个测量历史记录或扫描快照历史记录)。
这种实际涵盖不同上下文使用术语表示不同事物的情况的能力是 DDD 的优势之一(并且该术语具有不同含义的事实是一个非常强烈的迹象表明存在正在跨越上下文边界)。
在外部世界发生时捕获事件与将事件用于 re-hydrate 聚合是正交的。聚合今天没有映射事件的事实只是偶然事件,它可能会随着时间的推移而改变。但是捕捉事件是必要的。
顺便说一句,引发与聚合没有直接关系但对预测有价值的事件是正常的。
我过去有一个类似的例子。我们的 Identity
域侦听在 Email
子域中发布的事件,以针对之前发送给用户的电子邮件引发 EmailSent
和 EmailDelivered
事件。如果用户继续使用该网站,这些事件有时会乱序到达。聚合不包含表示此信息的属性,但此类事件有助于 cross-check 注册和转化。
我们正在将事件溯源和重构引入到我们应用程序的一部分中的丰富域模型中,但我们对其中的一部分感到有些困惑。
我们有 Tank
s,它们是聚合根,我们经常收到关于这些 Thank
s 的 TankGauge
信息。由于历史计量信息与任何业务逻辑都不相关,因此聚合不包含所有计量的集合,它仅包含对最新计量的引用。
为了显示历史仪表,我们设置了一个投影。
现在我们收到请求:我们想更新历史仪表的备注。这唯一相关的是持有历史指标的预测。这会导致在聚合上应用 RemarkSetOnHistoricalGauge
事件基本上是空操作,只有投影会相应更新。
这可行,但感觉有点违反直觉。对这种方法有什么建议吗?
我会考虑你这里是否有两个限界上下文:
- 储罐计量上下文:使用
TankGauge
命令,验证它们是否有意义(如果你没有,那么拥有Tank
聚合就没有意义)并发出TankGaugeWas
(TankLevelWas
?) 事件 - 坦克历史背景:允许remarks/annotations关于历史水平
这两个都有坦克的概念,但不是同一个。历史上下文使用来自测量上下文的事件(从历史上下文的角度来看,这些事件成为命令,隐含地“将此事件纳入您的世界观”)。它们可以有不同的聚合逻辑:甚至可能值得将坦克历史聚合建模为 time-windowed,例如明天的储罐与今天的同一个储罐不是同一个聚合体(这样做的主要好处是您不必加载整个测量历史记录或扫描快照历史记录)。
这种实际涵盖不同上下文使用术语表示不同事物的情况的能力是 DDD 的优势之一(并且该术语具有不同含义的事实是一个非常强烈的迹象表明存在正在跨越上下文边界)。
在外部世界发生时捕获事件与将事件用于 re-hydrate 聚合是正交的。聚合今天没有映射事件的事实只是偶然事件,它可能会随着时间的推移而改变。但是捕捉事件是必要的。
顺便说一句,引发与聚合没有直接关系但对预测有价值的事件是正常的。
我过去有一个类似的例子。我们的 Identity
域侦听在 Email
子域中发布的事件,以针对之前发送给用户的电子邮件引发 EmailSent
和 EmailDelivered
事件。如果用户继续使用该网站,这些事件有时会乱序到达。聚合不包含表示此信息的属性,但此类事件有助于 cross-check 注册和转化。