关于 CQRS 我不明白一件事:当引发的事件不包含更新读取模型所需的详细信息时,如何更新读取模型。
不幸的是,这是一种很常见的情况。
示例:我将用户添加到组,因此我发送 addUserToGroup(userId, groupId) 命令。该事件由命令处理程序接收、处理,创建、存储和发布 userAddedToGroup 事件。
现在,事件处理程序接收该事件和两个 ID。现在应该有一个视图,其中列出了所有用户及其所在组的名称。要更新该视图的读取模型,我们确实需要用户 ID(我们拥有)和组名称(我们不需要)没有,我们只有它的ID)。
所以问题是:我该如何处理这种情况?
目前,我想到了四种选择,每种选择都有其特定的缺点:
读取模型询问域。 => 禁止,甚至不可能,因为域只有行为,没有(公共)状态。
读取模型从读取模型中的另一个表读取组名称。 => 可以,但是如果没有匹配的表怎么办?
将必要的数据添加到事件中。 => 不起作用,因为这意味着我还必须更新所有以前的事件,并且我无法预见有一天我可能需要哪些数据。
不要通过“常规”事件处理程序处理事件,而是在后台启动 ETL 进程来处理事件存储、创建必要的数据并写入读取模型。 => 有效,但对我来说,对于这样一个简单的场景来说,这似乎有点太多的开销。
那么,问题是:我该如何正确处理这种情况?
有两种常见的解决方案。
1) “事件丰富”是指您确实在事件中添加反映您所提到的信息的信息,例如组名。这样做介于正确建模域和作弊之间。例如,如果您知道组名称发生了变化,那么在更改时发出名称并不是一个坏主意。想象一下,当您在报价单或发票上创建行项目时,您希望在发票创建事件中发出销售商品的价格。这是因为您必须遵守该价格,即使以后价格发生变化。
2) 同时投影多个流。编写一个投影仪来监视来自各种流的信息并将它们连接在一起。您可以观看用户和组事件以及添加到组事件的用户。根据系统中事件的顺序,您可能在知道组名称之前就知道用户位于组中,但在开始之前您应该知道事件存储的常规属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)