我的应用程序使用 CQRS 架构。一切都通过我的聚合执行,因此每个用户的操作都作为事件保存在我的事件源存储中。
现在,我需要一个新表单来显示在我的应用程序中执行的每个操作的历史记录,那么我该怎么办?
1 - 读取事件存储?如何 ?
2 - 在我的每个域处理程序中发布一个事件,例如“SavedToHistory(User user, Action action, DateTime date) 然后在我的事件处理程序中,将其存储在我的读取数据模型中?
由于 CQRS 的整个想法是将读取和写入以及存储(读取与再次写入)分离,我认为您可以采取的最一致的操作是将非规范化的历史数据写入 Read 数据库并从那里读取它而不是而不是尝试从 Event Store 中读取它。
这可以很简单;您可以编写一个通用的非规范化程序,它可以将事件存储中的任何新事件写入读取数据库中的非规范化版本,或者您可以使用专门的非规范化程序——这取决于您希望如何在应用程序中显示历史记录。
无论哪种方式,将事件的非规范化版本写入读取数据库,这样您的应用程序就不需要确切地知道事件在事件存储中的结构。
如果您需要为开发人员显示完整的历史记录,那么您可以将所有事件复制到域日志(读取模型,其中包含允许开发人员查看的所有事件的汇总列表)。
如果您需要向用户显示历史记录,那么显示反序列化的事件就不会那么好用。相反,您可以拥有一个读取模型,将每个事件映射到具有一些人类可读描述的活动。这就是我们为类似 facebook 的“最新消息”提要所做的事情。
管理读取模型的相同规则适用于这两种情况 - 如果您更改聚合事件的规则或将它们映射到人类可读的活动,则只需删除读取模型并从历史记录中完全重建它。