除了使用事件源模式存储动作事件之外,是否可以存储状态事件?

问题描述 投票:0回答:1
考虑以下场景:

事件源聚合管理包的传输 它可以接收诸如“包裹在早上 5 点加载”、“包裹在早上 7 点停止在这里”等命令......

聚合创建与这些操作相对应的事件,并根据这些事件计算“包裹行程”、“包裹的当前位置”等状态...(这些状态也用作其他状态的构建块)

这些事件被调度来读取模型,但从这些事件派生的状态则不会。

如果我想要一个读取模型 API 来获取包裹行程,似乎有两个选择:

  • 在读取模型和聚合之间共享/复制代码,以便给定相同的事件,它们可以计算相同的状态。

  • 让聚合作为状态机工作,以便当行程更改时,它会创建一个“行程更新”事件,并附加行程。

      事件日志看起来像“跟踪已创建”、“某些行程不相关事件”、“包裹已加载”、“行程已更新”、“包裹在此停止”、“行程已更新”等...
第二个解决方案对我来说似乎更实用,并且避免了在写入和读取之间维护事件的“共享解释”,如果状态建立在其他状态之上,这可能会变得复杂。

然而,这意味着编写“状态事件”,并且似乎违背了“事件源是重播操作来计算状态”。

你觉得怎么样?

design-patterns domain-driven-design cqrs event-sourcing
1个回答
0
投票
CQRS 和分离读取模型的问题,并不是在读取模型上应用事件逻辑。读取模型应该是优化的和虚拟的,因为它反映了您的域和当前状态发生的所有事实。

事实上,

在不变量和业务规则验证之后,读取模型会得到更新。换句话说,在读取模型中,您不关心实体迄今为止“如何”获得其状态的历史。你只关心的是什么是它的状态。 所以我认为你应该保留域的最后状态。

© www.soinside.com 2019 - 2024. All rights reserved.