在事件溯源系统中,我可以想到两个地方来放置域逻辑,但每个地方都有缺点。
- 在聚合的事件处理程序中,在创建事件后本地调用。(这是我在大多数 示例 中看到的,尽管它们大多具有非常简单的逻辑)
问题: 存储在事件存储中并发布给订阅者的事件不包括此已处理的数据,因此在投影上必须应用相同的逻辑。 - 在创建事件之前。现在,处理后的数据可以存储在事件中,投影不必知道任何业务逻辑。(我没有在示例中看到过这种方法)
问题: 在这种情况下,事件仅包括已处理的数据,这可能会导致信息丢失。
更糟糕的是: 我还失去了通过重播事件来纠正错误业务逻辑的可能性,因为事件数据已经被计算出来了。
示例: 从一些数据计算度量值。
我要么需要两次计算度量值(一次在域模型中,一次在投影中)
要么在发送事件之前计算度量值并将其包含在其中。