我对使用域事件构建读取模型的系统中的流程有点困惑。特别是,我们如何处理用户期望数据(及其视图)在他们完成命令时发生变化的事实,但由于我们的系统架构(发布事件的非阻塞调用),实际数据库可能不会在页面是否重新加载?
我希望使用事件和服务总线将我们其中一个系统的设计与 CQRS 更加内联。
假设我的流程是这样的:
用户单击视图中的按钮以执行从其帐户中删除付款方式的任务。
控制器调用 PaymentMethodRemovalService,将 accountId 和 paymentMethodId 传递给它。
控制器使用 AccountRepository 检索 Account 并调用 account.RemovePaymentMethod(id)
帐户验证可以发生操作并发布事件 PaymentMethodRemovedMessage(accountId, paymentMethodId)
因为事件发布是异步的,我们现在必须从服务返回并从控制器返回视图——但我们的实际数据还没有更新!
处理程序 IHandle< PaymentMethodRemovedMessage > 听到事件并从数据库中删除实际行
那么,男人该怎么办?
我可以简单地说,删除显示付款方式的 div。这可能适用于 AJAX 场景,但如果我使用 Post-Redirect-Get 来支持非 JavaScript 客户端怎么办。然后我将触发我的 Get 并从 Query 端读取数据,可能在更新之前。
我是否只显示一条通知,说明他们删除付款方式的请求已提交?(这似乎并不友好,对于提交订单有意义,但对于更改地址则不然)。
有没有办法协调将更改实现为分离的异步事件并显示反映其当前更改的用户数据?
编辑:我的问题与CQRS、DDD 同步报告数据库非常相似, 我不得不说,那里给出的答案以及这里也提到的,有点味道 - 争吵 UI 以显示带外的更新可以这么说,读取数据库。我希望有一些更清洁的东西。