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");
如果处理程序无法保存对域的更改,该怎么办?
好吧,可以在命令处理程序端使用队列来发布响应,以将Web应用程序订阅到队列.
最终用户如何获得即时/同步ui响应,这将反映对域的实际更改?我应该这样做吗?
通过消息总线处理命令是否仅适用于没有确认的后台任务?
这取自可能对您感兴趣的Jimmy Bogard博客«Busting a CQRS Mythths»:
神话#4 - 命令是永远不会发生的
您的工作中有多少业务流程真正被解雇了?您通常至少需要一个同步确认来接收和接受该命令.如果您正在执行该命令的异步发送,您如何通知用户?电子邮件?他们还好吗?
相反,使用需要繁重的命令来完成请求,我们真的有两件事情在进行:
- 接受请求
- 满足要求
接受请求应该是同步的.实现不必是.但对于异步实现的模型,我们仍然可能需要关联请求等的方法,这是您经常看到工作流/流程/传奇发挥作用的地方.
我总是试图让我的命令同步.如果有一个很长的处理时间,我正在使用像流程管理器或传奇这样的东西.