在 ES + CQRS + DDD 中,事件是否可以完全不更新任何真实域状态?

In ES + CQRS + DDD, can a event not update any real domain state at all?

事件流中的事件不影响域状态中的任何聚合是否可以?

以 AllCompletedTodosPurged 之类的事件为例,它只是通过删除所有已完成的待办事项来更改 读取模型 和活动待办事项。

通过不影响聚合,我假设您的意思是聚合 class 本身内部的私有变量?如果您有其他意思,请忽略此答案。

我发现第一次实现 ES 的开发人员往往会纠结于这个问题。我第一次做端到端参考实现时,遇到了完全相同的问题。

我真的很惊讶地发现本地聚合状态并不像我想象的那么有用——该状态几乎总是以预测读取模型的形式更自然地表达。您真正唯一需要本地状态的时候是需要处理单个事件(例如验证)的时候。

所以我想说不仅支持不改变本地聚合状态的事件是可以接受的,这些类型的事件可以说比 改变本地状态的事件更常见.

不,这样不行。当聚合状态发生变化时,会生成一个领域事件。如果没有任何变化,则没有域事件。

您也可以在域外使用事件,但它们不是域的一部分,显然也不是事件流的一部分。

在您的场景中,如果事件不是由于聚合变化而生成的,为什么它应该包含在 any 聚合中?从技术上讲,如果该事件不属于任何事物,您会将其添加到哪个事件流中?您会为所有涉及的待办事项添加该事件吗?没有意义。

我不确定清除是否是您域的一部分,但如果是,则意味着所有已完成的待办事项都已经 'deleted' 即每个涉及的聚合已经有 ToDoDeleted 事件它的集合。 AllCompletedTodosPurged 只是一个对更新读取模型有用的事件,仅此而已。它不应该影响域模型。