在我们想要历史时阅读事件采购是否正确?

时间:2011-07-22 12:35:56

标签: c# cqrs

我的应用程序使用CQRS架构。所有内容都通过我的聚合执行,因此每个用户的操作都会保存为事件源存储中的事件。

现在,我需要一个新表单来显示我的应用程序中执行的每个操作的历史记录,那么我该怎么办?

1 - 阅读活动商店?怎么样?

2 - 在我的每个域名处理程序中发布一个事件,例如“SavedToHistory(用户用户,操作操作,日期时间日期)”,然后在我的事件处理程序中,将其存储在我的读取数据模型中?

2 个答案:

答案 0 :(得分:4)

由于CQRS的整体思想是将读写和存储分开(读取与再次写入),我认为您可以采取的最一致的操作是将非规范化的历史数据写入Read数据库并读取它从那里而不是试图从事件存储中读取它。

这可以直截了当;您可以编写一个通用的非规范化程序,它可以将事件存储中的任何新事件写入Read数据库中的非规范化版本,或者您可以使用专门的非规范化程序 - 这取决于您希望如何在应用程序中显示历史记录。

无论哪种方式,都要将事件的非规范化版本写入Read DB,这样您的应用程序就不需要确切知道事件在事件存储中的结构。

答案 1 :(得分:4)

如果您需要显示开发人员的完整历史记录,那么您只需将所有事件复制到域日志(读取模型,其中包含允许开发人员查看的所有事件的汇总列表)。

如果您需要向用户显示历史记录,那么显示反序列化的事件将无法正常工作。相反,您可以使用读取模型将每个事件映射到具有某些人类可读描述的活动。这就是我们为Facebook做的“什么是新的”提要。

管理读取模型的相同规则适用于这两种情况 - 如果您更改聚合事件的规则或将它们映射到人类可读的活动,那么只需删除读取模型并从历史中重建它。