我有一个 CQRS 解决方案,它在 HTML/JavaScript 应用程序中利用 NServiceBus 和网络 worker 。
我有场景
- WebAPI 发送命令
- CommandHandler 更新域聚合根
- CommandHanlder 将事件发布到更新读取模型的事件处理程序
- EventHandler 更新读取模型
我想在一切完成后在 UI 中向用户提供反馈(但不阻止 UI)。
我知道我可以使用 Bus.Return 从我的 Bus.Send 返回到我使用时的 CommandHandler,表明它的工作已经完成。但是,一旦 Bus.Publish 触发的 EventHandlers 完成了他们的工作,我该如何提供反馈呢?
我可以使用 EventHandler 中的 Bus.Reply...但是如何返回到原始发件人?我真的需要使用 Saga 来完成这个吗?如果我和 ReplyToOriginator 这样做,一旦发起者收到回复,我如何将回复关联到正确的用户/UI 以进行通知?我是否必须在某处跟踪所有待处理通知的请求?这似乎过于复杂。
最佳答案
听起来 WebAPI 服务有兴趣知道“域”端点何时完成 XXX 工作。如果是这样的话,从域端点简单地发布一个事件就有意义了,然后任何关心正在完成的那种类型的工作的人都可以订阅这种事件类型。事件本质上是一种有趣的状态变化,因此如果正在完成的工作代表了一种有趣的状态变化,那么发布事件就非常有意义。
如您所述,Bus.Reply() 也可以。我倾向于使用事件来避免显式请求/响应范例。
收到事件/响应后,将信息返回给用户/浏览器是 WebAPI 服务的问题,因此需要某种形式的状态跟踪。 saga、数据库或内存中构造可以工作,但也可以通过在两个方向上传递与消息相关的 Id 来实现,这取决于您如何将信息返回给用户(例如信号器)。
关于c# - CQRS NServiceBus UI 反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31297211/