处理排队的命令处理程序响应.CQRS

lex*_*eme 6 c# messaging domain-driven-design masstransit cqrs

考虑一下情况:

public class OrderController {
    IBus bus;

    public OrderController(IBus bus) {
        this.bus = bus;
    }

    public ActionResult Checkout(String orderId) {
        var command = new CheckoutOrderCommand(orderId);
        bus.Send(command);

        return Redirect("on-success-url");
    }
}
Run Code Online (Sandbox Code Playgroud)

相应的命令处理程序(在单独的程序集中定义)正在等待处理的incomming消息.

但是我们已经说过发送一切都好 return Redirect("on-success-url");

  1. 如果处理程序无法保存对域的更改,该怎么办?

    好吧,可以在命令处理程序端使用队列来发布响应,以将Web应用程序订阅到队列.

  2. 最终用户如何获得即时/同步ui响应,这将反映对域的实际更改?我应该这样做吗?

  3. 通过消息总线处理命令是否仅适用于没有确认的后台任务?

Tom*_*uλa 8

这取自可能对您感兴趣的Jimmy Bogard博客«Busting a CQRS Mythths»:

神话#4 - 命令是永远不会发生的

您的工作中有多少业务流程真正被解雇了?您通常至少需要一个同步确认来接收和接受该命令.如果您正在执行该命令的异步发送,您如何通知用户?电子邮件?他们还好吗?

相反,使用需要繁重的命令来完成请求,我们真的有两件事情在进行:

  • 接受请求
  • 满足要求

接受请求应该是同步的.实现不必是.但对于异步实现的模型,我们仍然可能需要关联请求等的方法,这是您经常看到工作流/流程/传奇发挥作用的地方.

我总是试图让我的命令同步.如果有一个很长的处理时间,我正在使用像流程管理器或传奇这样的东西.