关于 CQRS 我没有得到一件事:当引发的事件不包含更新读取模型所需的详细信息时,如何更新读取模型。
不幸的是,这是一个很常见的场景。
示例:我将用户添加到组中,因此我发送了 addUserToGroup(userId, groupId) 命令。这由命令处理程序接收、处理、创建、存储和发布 userAddedToGroup 事件。
现在,事件处理程序接收此事件和这两个 ID。现在应该有一个视图列出了所有用户及其所在组的名称。要更新该视图的读取模型,我们确实需要用户 ID(我们有)和组名(我们没有没有,我们只有它的 id)。
所以问题是:我该如何处理这种情况?
目前,我想到了四个选项,它们都有其特定的缺点:
读取模型询问域。=> 禁止,甚至不可能,因为域只有行为,没有(公共)状态。
读取模型从读取模型中的另一个表中读取组名。=> 有效,但是如果没有匹配表怎么办?
将必要的数据添加到事件中。=> 不起作用,因为这意味着我还必须更新所有以前的事件,而且我无法预见有一天我可能需要哪些数据。
不要通过“通常的”事件处理程序来处理事件,而是在后台启动一个 ETL 进程来处理事件存储,创建必要的数据并写入读取模型。=> 工作,但对我来说,对于这样一个简单的场景来说,这似乎有点太多的开销。
所以,问题是:我该如何正确处理这种情况?