2

当使用经典的“当前状态”持久性时,我们可能会向实体添加一个新属性。例如,使用博客有很多帖子的场景,我们可能会为帖子实体添加一个“评级”属性。我们希望将 Rating 值默认为 3,因此当我们在 DB 中添加一列时,默认值设置为 3。

在 CQRS 中,我读到处理此问题的一种策略是在构造函数中设置默认值 (Rating = 3),因此当从事件重放时,默认值将可用,除非有显式事件更改评级值。这对我来说似乎不是一个很好的解决方案,因为没有创建事件,因此读取模型(或其他流程管理器/BC)不会考虑默认值。(这里可能错了吗?)

因此,当将新属性添加到聚合时,应该在该聚合类型的每个“实例”上发出命令,设置默认值,从而创建所需的事件,这似乎是合乎逻辑的 - 因此读取模型被更新和其他processes / BCs 可以消费和处理事件。也许我在这方面做得很差?

我没有找到很多关于 NEventStore 工具的信息,所以我想知道正在使用什么策略?

我能想到的一种策略是,需要为每个“发布”创建一个一次性的可执行文件/脚本,它将:

  1. 获取给定类型的所有聚合的列表
  2. 在每个实例上执行命令,为新属性设置默认值,从而创建更新读取模型所需的事件

另一种策略可能是在读取模型被重构以包含新属性时在读取模型中设置默认值。但是,这对可能想要了解默认值的其他进程或 BC 没有帮助。

如果可以为给定聚合类型的所有流“制造”事件,那么通用工具会很棒。

其他人使用什么策略来处理对域的此类更改?

关于#1 - 我不相信 EventStore 中有 GetAllStreams< TAggregate> 功能,或者无论如何将 StreamId 映射到聚合类型,所以我看到获取给定类型的所有聚合(流 ID)的唯一方法是从读取模型查询?。如果要创建一个“通用工具”来帮助解决这个问题,那么该工具将需要了解读取模型模式才能获得流 ID 列表,这将使其不那么“通用”

4

0 回答 0