以下示例:https://msdn.microsoft.com/en-us/library/jj591569.aspx(图3)
它如何适合http应用程序?
用户应该向PlaceOrderController执行一个http请求,它将发送一个PlaceOrderCommand,但是Order Process Manager将如何回答"9"?"订单确认"给用户?控制器如何意识到这一点,以便将此信息返回给用户?
谢谢
你根本没有立即回答"订单确认"。看看亚马逊和其他购物网站是怎么做的:在提交订单时,您只会收到一个"订单已接受确认"(例如,HTTP代码202已接受)。当订单流程管理器处理了实际订单后,将通过单独的消息/通道(例如,电子邮件)向用户发送"订单确认"通知。
@Hippoom为你指明正确的方向。
CQRS旅程(你在读什么)说:
团队后来替换了这个机制来检查系统是否使用Post-Redirect-Get的实现保存订单模式。的新版本启动注册动作方法。有关的更多信息Post-Redirect-Get模式参见Post/Redirect/Get on文章维基百科。
[HttpPost] public ActionResult StartRegistration(string conferenceCode, OrderViewModel contentModel) { ... this.commandBus.Send(command); return RedirectToAction( "SpecifyRegistrantDetails", new { conferenceCode = conferenceCode, orderId = command.Id }); }
操作方法现在重定向到specificyregistrantdetails视图在它发送命令之后。下面的代码示例显示了specificyregistrantdetails操作如何轮询订单返回视图之前的存储库。
[HttpGet] public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId) { var draftOrder = this.WaitUntilUpdated(orderId); ... }
第二种方法的优点,使用Post-Redirect-Get模式而不是在starregisterpost动作中与浏览器的前进和后退导航按钮配合得更好,它给出
这里我们讨论的是毫秒级的最终一致性,或者最坏的情况下是几秒级的一致性。所以p - r - g模式非常适合。
无论如何,你可以在这里和那里阅读有关最终一致性UI的文章,它们可以帮助你。
POST COMMENT EDIT:
Udi Dahan说:
什么时候应该避免使用CQRS?
答案是大多数时候。
这是我能给你的最强烈的暗示,让你知道你是正确执行CQRS:您的聚合根是传奇
所以,我认为你的问题不是发现CQRS如何为HTTP应用程序工作。您的问题是,对于您正在质疑的过程和用例,您应该避免使用CQRS。
您的Web/REST api独立于您的域模型,但根据您的用例和用户代理需求映射到它。一种方法是提交一个"作业",然后轮询该作业的进度。有许多权衡需要考虑。例如,根据您的基础结构,发送通知可能是最好的方法。如果你想要REST/HTTP,你可以试试这个:
用户代理:
POST /jobs/registrations
..content..
原始服务器:
HTTP/1.1 303 See Other
Location /jobs/registration/<some-job-id>
用户代理:
GET /jobs/registration/<some-job-id>
..content with job status..