按照这个例子:https ://msdn.microsoft.com/en-us/library/jj591569.aspx (图3)
它如何适合 http 应用程序?
用户应该向 PlaceOrderController 执行 http 请求,它将发送 PlaceOrderCommand,但是 Order Process Manager 将如何向用户回答“9. Order Confirmed”?控制器如何意识到这一点,以便将此信息返回给用户?
谢谢
按照这个例子:https ://msdn.microsoft.com/en-us/library/jj591569.aspx (图3)
它如何适合 http 应用程序?
用户应该向 PlaceOrderController 执行 http 请求,它将发送 PlaceOrderCommand,但是 Order Process Manager 将如何向用户回答“9. Order Confirmed”?控制器如何意识到这一点,以便将此信息返回给用户?
谢谢
您根本不会立即回答“订单已确认”。看看亚马逊和其他购物网站是如何做到的:提交订单后,您只会收到“订单已接受确认”(例如,HTTP 代码 202 已接受)。当订单流程经理处理了实际订单时,会收到“订单”在单独的消息/频道(例如,电子邮件)上的“已确认”通知被发送给用户。
@Hippoom 为您指明了正确的方向。
CQRS Journey(你在读什么) 说:
该团队后来用 Post-Redirect-Get 模式的实现替换了这种检查系统是否保存订单的机制。以下代码示例显示了新版本的 StartRegistration 操作方法。有关 Post-Redirect-Get 模式的更多信息,请参阅 Wikipedia 上的文章Post/Redirect/Get。
[HttpPost] public ActionResult StartRegistration(string conferenceCode, OrderViewModel contentModel) { ... this.commandBus.Send(command); return RedirectToAction( "SpecifyRegistrantDetails", new { conferenceCode = conferenceCode, orderId = command.Id }); }
现在,action 方法在发送命令后立即重定向到 SpecifyRegistrantDetails 视图。以下代码示例显示了 SpecifyRegistrantDetails 操作如何在返回视图之前轮询存储库中的订单。
[HttpGet] public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId) { var draftOrder = this.WaitUntilUpdated(orderId); ... }
第二种方法的优点是,使用 Post-Redirect-Get 模式而不是 StartRegistration 后操作,它可以更好地与浏览器的前进和后退导航按钮配合使用,并且它提供
在这里,我们谈论的是毫秒或最坏情况下几秒的最终一致性。所以 PRG 模式非常适合。
无论如何,在这里和这里,您可以阅读有关最终一致性 UI 的文章,而不是对您有所帮助。
发表评论编辑:
她的e Udi Dahan 说:
什么时候应该避免 CQRS?
答案是大多数时候。
这是我能告诉你的最有力的迹象,表明你正在正确地做 CQRS:你的总根是 sagas
所以,我认为你的问题不是发现 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..