在使用带有域事件和ServiceBus的CQRS和DDD时显示View中的更改

que*_*rin 11 domain-driven-design nservicebus cqrs event-sourcing domain-events

我对使用域事件构建读取模型的系统中的流程感到有些困惑.特别是,我们如何处理用户期望数据(及其视图)在完成命令时发生更改的事实,但由于我们的系统架构(对发布事件的非阻塞调用),实际数据库可能不会在页面重新加载?

我希望使用事件和服务总线将我们的一个系统的设计与CQRS更加一致.

让我们说我的流程是这样的:

  1. 用户单击"查看"中的按钮可执行从其帐户中删除付款方式的任务.

  2. 控制器调用PaymentMethodRemovalService,并将其传递给accountId和paymentMethodId.

  3. Controller使用AccountRepository检索Account并调用account.RemovePaymentMethod(id)

  4. 帐户验证可以进行操作并发布事件PaymentMethodRemovedMessage(accountId,paymentMethodId)

  5. 因为事件发布是异步的,所以我们现在必须从服务返回并从控制器返回视图 - 但是我们的实际数据还没有更新!

  6. 处理程序IHandle <PaymentMethodRemovedMessage>,检测事件并从数据库中删除实际行

那么,一个人要做什么?

我可以简单地说,删除显示付款方式的div.这可能适用于AJAX场景,但如果我使用Post-Redirect-Get来支持非JavaScript客户端会怎样.然后我将触发我的Get并从查询端读取数据,可能在更新之前.

我是否只是显示一条通知,说明他们已提交删除付款方式的请求?(这似乎不友好,提交订单是有意义的,但不是,例如,更改地址).

有没有办法将实现更改协调为解耦异步事件并显示反映其当前更改的用户数据?

编辑:我的问题非常类似于CQRS,DDD同步报告数据库 我不得不说,那里给出的答案也提到了这里,有一点气味 - 争论用户界面显示一个带外的更新读取DB,可以这么说.我希望有点清洁.

Ada*_*les 8

如果您被锁定在请求/响应模型中,则可以采用相关请求/响应模式.有关详细信息,请查看NSB下载中的Async Pages示例.这演示了ASP.NET设置中的请求/响应.如果那更像是你的东西,那里有一些ASP.NET MVC示例.

引入异步处理时,您接受数据将过时.有人可能会争辩说,在您查询数据库时,数据已经过时(网络延迟,渲染时间等).既然数据已经老了,我们必须问多大年纪已经足够了?

还需要考虑的一件事是你的处理有点乱.步骤3应该在将命令发送到服务器之前验证该命令,然后步骤3,4将在6之后进行.只有在命令有效且仅在数据库成功更新时才应发布事件时才应更新数据库.