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

时间:2015-09-28 13:05:38

标签: domain-driven-design cqrs event-sourcing

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

举个例如AllCompletedTodosPurged之类的事件,除了通过删除所有已完成的待办事项来更改带有活动待办事项的读取模型之外什么都不做。

2 个答案:

答案 0 :(得分:1)

不,不行。聚合状态更改时会生成域事件。如果没有任何变化,则没有域事件。

您也可以使用域外的事件,但它们不属于域,显然不属于事件流。

在您的方案中,如果事件不是由聚合更改生成的,那么为什么它应该被任何聚合包含?从技术上讲,如果事件不属于任何事件,您将在哪个事件流中添加该事件?你会为所有涉及的ToDos添加该事件吗?这毫无意义。

我不确定清除是否属于您的域名,但如果是,则意味着所有已完成的待办事项都被“删除”,即每个涉及的聚合已经在其集合中具有ToDoDeleted事件。 AllCompletedTodosPurged只是一个对更新读模型有用的事件,但就是这样。它不应该影响域模型。

答案 1 :(得分:0)

通过不影响聚合,我假设您在聚合类本身中表示私有变量?如果您有其他意思,请忽略此答案。

我发现第一次实施ES的开发人员倾向于讨论这个问题。我第一次进行端到端的参考实现,我有完全相同的问题。

我真的很惊讶地发现局部聚合状态并不像我想象的那样有用 - 状态几乎总是以投影读取模型的形式更自然地表达。 真正需要本地状态的唯一时间是需要处理单个事件时(例如,用于验证)。

所以我会说它不仅可以支持不会改变本地聚合状态的事件,这些类型的事件可能比更改本地事件更常见状态。