事件溯源和清洁架构——领域模型是否需要处理事件?

Event Sourcing and Clean Architecture - does domain model need to handle events?

我仍在学习干净的架构,现在我正在尝试在项目中实施事件溯源。 我有 2 个项目,一个包含命令和事件,一个是域模型。 根据干净架构的定义,域模型是一切的中心。一切都参考他。 但是,我发现的所有示例都表明域模型对每个事件都有 Apply 方法。

我需要在域模型中执行此操作吗?或者是其他方式?

在代码中的某些地方,我需要从类似这样的事件中重建领域模型:

public void Load(events){
foreach(var event in events)
{
   Apply(event);
}}

这应该在域模型 class 中,如 Apply 方法。 Apply 方法更改域模型的内部状态。

all examples that I found shows that domain model have Apply methods for each event. Do I need to do this in domain model?

您不必“必须”这样做,但这是名词王国设计中可能出现的结果。由于领域驱动设计 (Java) 和事件溯源 (C#) 的大部分早期开发都发生在名词王国中,因此这些示例倾向于共享这些模式。

使用 Apply 模式,您将看到两种不同想法的结果。

第一,所有事件源模型都具有相同的底层数据结构(事实是事件的历史),因此我们应该对所有这些模型使用一个通用的通用实现。

第二,我们在数据模型(也称为模型对象的“属性”)中缓存的信息应该看起来“相同”,无论我们是在查看处理命令的原始对象还是在查看从历史记录中加载的该模型的副本。

因此,出现了一种模式,模型倾向于从拥有事件历史的某些基础 class 和 api 中“继承”以协调对历史和模型自身内部缓存的更改,并且该模型上的命令处理程序通过首先计算应该发生哪些更改(事件),然后 应用 这些更改使用与重新加载事件历史记录时将使用的相同代码路径来工作。