我已经实现了一个事件存储系统,其中我的根聚合以仓库为模型。我有一些事件BoxCreated
,BoxLocationChanged
例如。这两个事件都有单独的事件处理程序来更新读取侧表dbo.Boxes
。
然而,我现在已经到了这两个处理程序都需要更新另一个读取端数据库的地步,该数据库dbo.BoxType
跟踪每个盒子类型的库存状态和位置。
我的问题是我是否应该为这些新的读取端更新创建一个单独的事件处理程序(使用相同的事件),还是应该将另一个存储库注入当前事件处理程序并在同一个事件处理程序中处理所有读取端更新?
哪个是首选的设计选择?选择是否取决于我未列出的其他因素?
为了演示,使用 MediatR,我目前有如下事件处理程序:
public class BoxCreatedHandler : INotificationHandler<BoxCreated>
{
private readonly IBoxRepository _repo;
public BoxCreatedHandler(IBoxRepository repo)
{
_repo = repo;
}
public async Task Handle(BoxCreated e, CancellationToken ct)
{
Box b = JsonConvert.DeserializeObject<Box>(e.Data);
_repo.CreateBox(b);
// QUESTION: do I just go ahead and do my stock and location update here using another injected repo?
// Or should I register another handler for this event that does the update?
// todo: how to handle read db update errors here? Will need to queue a aggregate replay to rebuild the read db?
}
}
如果您可以为我指出如何处理读取端更新失败的正确方向,则可以加分。
谢谢!