gpt4 book ai didi

domain-driven-design - 将 CQRS 和 DDD 与领域事件和服务总线结合使用时,在 View 中显示更改

转载 作者:行者123 更新时间:2023-12-04 02:16:09 25 4
gpt4 key购买 nike

我对使用域事件构建读取模型的系统中的流程有些困惑。特别是,我们如何处理这样一个事实,即用户在完成命令时希望数据(及其 View )发生变化,但由于我们的系统架构(发布事件的非阻塞调用),实际数据库可能不会在执行命令之前发生变化页面重新加载?

我希望使用事件和服务总线使我们的一个系统的设计更符合 CQRS。

假设我的流程是这样的:

  • 用户单击 View 中的按钮以执行从其帐户中删除付款方式的任务。
  • Controller 调用 PaymentMethodRemovalService,将其传递给 accountId 和 paymentMethodId。
  • Controller 使用 AccountRepository 检索 Account 并调用 account.RemovePaymentMethod(id)
  • 帐户验证操作可以发生并发布事件 PaymentMethodRemovedMessage(accountId, paymentMethodId)
  • 因为事件发布是异步的,我们现在必须从服务返回并从 Controller 返回 View - 但我们的实际数据还没有更新 !
  • 处理程序 IHandle< PaymentMethodRemovedMessage > 监听事件并从数据库中删除实际行

  • 那么,一个人该怎么办?

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

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

    有没有办法将实现更改作为解耦异步事件进行协调并显示反射(reflect)其当前更改的用户数据?

    编辑:我的问题与 CQRS, DDD synching reporting database 非常相似我不得不说,那里给出的答案以及这里也提到过,有一点点味道 - 可以说是在 UI 上争吵以显示与读取 DB 带外的更新。我希望有一些更清洁的东西。

    最佳答案

    如果您被锁定在请求/响应模型中,您可以采用相关请求/响应模式。有关详细信息,请查看 NSB 下载中的异步页面示例。这演示了 ASP.NET 设置中的请求/响应。如果这更适合您,这里有一些 ASP.NET MVC 示例。

    当您引入异步处理时,您接受数据将是陈旧的。有人可能会争辩说,当您查询数据库时,数据已经很旧(网络延迟、渲染时间等)。既然数据已经老了,那我们就要问,多大才算好?

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

    关于domain-driven-design - 将 CQRS 和 DDD 与领域事件和服务总线结合使用时,在 View 中显示更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3875162/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com