我已经实现了一个事件存储系统,其中我的根聚合是根据仓库建模的。我有一些事件,例如this.state.locations[0].infoWindowStatus
和BoxCreated
。这两个事件都有单独的事件处理程序,它们会更新读取侧表BoxLocationChanged
。
但是,现在我要说的是,这两个处理程序都需要更新另一个读取侧数据库dbo.Boxes
,该数据库可以跟踪每种包装盒类型的库存状态和位置。
我的问题是我是否应该为这些新的读取方更新创建单独的事件处理程序(使用相同的事件),还是应该将另一个存储库注入当前事件处理程序中并在同一事件中处理所有读取方更新?处理程序?
哪个是首选的设计选择?选择是否取决于我未列出的其他因素?
为了演示如何使用MediatR,我目前具有如下事件处理程序:
dbo.BoxType
如果您能为我指出正确的方法来处理读取端更新失败,请加分。
谢谢!
答案 0 :(得分:0)
这取决于什么可以触发框类型更改。如果仅在另一个事件的上下文中更改框类型,则应该在此事件处理程序中更新读取模型。如果存在专门用于更改框类型的工作流,则应通过新事件和处理程序使用该工作流,以便所有框类型更改都遵循相同的逻辑。
我不喜欢在同一个有界上下文中为同一个事件使用多个处理程序,因为它可能会造成混乱。处理程序可能会按顺序触发,从而导致难以发现的业务逻辑问题。
在您发布的另一个问题中,您讨论了批量创建框以及为每个框生成和移动消息的问题。根据您的事件存储,如果创建事件导致盒类型更改事件,而移动事件导致盒类型更改事件不同,则这些事件可能无法以正确的顺序到达。事件的顺序取决于事件日志引擎(Kafka与Kinesis与Event Hub不同),因此您必须注意其工作方式,以确保框的类型正确。