我目前处理的情况是,我需要根据这是否是我的汇总第一次陷入某种情况(订单已被购买)做出决定。
我可以通过两种方式解决这个问题:
选项2是否可以接受?出于某种原因,我认为选项1)对于一般情况更安全/更清洁,但我缺乏这些事项的经验。
由于
答案 0 :(得分:3)
恕我直言,两者都有效地做同样的事情:说明购买订单的领域需要以某种方式保持水分。基本上这将作为重播的一部分完成,这基本上没有任何意义,只有当OrderWasBought
事件发生时,该字段将被设置。
因此,如果您查看该字段,或者如果您查找事件的存在,则没有任何区别。当它与有效结果有关时,至少它没有任何区别。
谈到效率,使用一个领域可能是更好的主意,因为这种方式会在重放过程中获得水分,无论如何都需要运行。因此,您不必再次搜索事件列表,但只需查看字段中的(缓存)值即可。
所以,最后,长话短说:没关系。使用感觉更好的你。如果聚合的历史记录变得冗长,那么就性能而言,最好使用现场方法。PS:当然,这取决于如何加载聚合的实现 - 聚合是否能够访问自己的事件历史记录?如果没有,无论如何,在重放聚合时设置字段是唯一的选择。请注意,聚合不会(也不应该!)有权访问底层存储库,因此无法自行加载其历史记录。
答案 1 :(得分:0)
只要用例不需要聚合的先前状态,选项2就是有效的。重播事件只会恢复只读状态,如果当前命令不关心它,搜索某个事件可能是一个有效的简单解决方案。
如果你突破封装"这种担忧可能不适用。事件采购和汇总是概念,主要是他们没有强加某种OO方法。事件存储包含表示为事件流的业务状态。您可以随时阅读并将其用作不可变集合。如果我需要恢复某个复杂状态,我会重播事件 。但就你的情况而言,更简单的事件就是'封装为服务的解决方案应该可以很好地工作。
话虽如此,总是重播事件以恢复状态并拥有该字段并没有错。这主要是风格问题,在一致的做事方式之间做出选择,或者根据特定情况选择最简单的解决方案。