4

按照这个例子:https ://msdn.microsoft.com/en-us/library/jj591569.aspx (图3)

它如何适合 http 应用程序?

用户应该向 PlaceOrderController 执行 http 请求,它将发送 PlaceOrderCommand,但是 Order Process Manager 将如何向用户回答“9. Order Confirmed”?控制器如何意识到这一点,以便将此信息返回给用户?

谢谢

4

3 回答 3

4

您根本不会立即回答“订单已确认”。看看亚马逊和其他购物网站是如何做到的:提交订单后,您只会收到“订单已接受确认”(例如,HTTP 代码 202 已接受)。当订单流程经理处理了实际订单时,会收到“订单”在单独的消息/频道(例如,电子邮件)上的“已确认”通知被发送给用户。

于 2015-09-16T07:02:45.223 回答
2

@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。

于 2015-09-16T10:58:49.380 回答
0

您的 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..
于 2016-04-12T01:37:49.710 回答