只要注册者知道更改已经被持久化,并且UI显示的内容可能过期了几秒钟,他们就不会担心。 实现细节
本节描述订单和注册限界上下文的实现的一些重要功能。您可能会发现拥有一份代码拷贝很有用,这样您就可以继续学习了。您可以从Download center下载一个副本,或者在GitHub上查看存储库:https://github.com/mspnp/cqrs-journey-code。您可以从GitHub上的Tags页面下载V1发行版的代码。
备注:不要期望代码示例与参考实现中的代码完全匹配。本章描述了CQRS过程中的一个步骤,随着我们了解更多并重构代码,实现可能会发生变化。 会议管理限界上下文会议管理限界上下文允许业务客户定义和管理会议,它是一个简单的两层、CRUD风格的应用程序,使用ASP.MVC。
在Visual Studio解决方案中,Conference项目包含模型代码和Conference.Web项目。Conference.Web项目包含MVC View和Controller。
与订单和注册限界上下文进行集成会议管理限界上下文通过发布以下事件将更改通知推送到会议。
ConferenceCreated。在业务客户创建新会议时发布。
ConferenceUpdated。在业务客户更新现有会议时发布。
ConferencePublished。每当业务客户发布会议时发布。
ConferenceUnpublished。每当业务客户取消发布新会议时发布。
SeatCreated。每当业务客户定义新座位类型时发布。
SeatsAdded。每当业务客户增加座位类型的配额时发布。
Conference项目中的ConferenceService类将这些事件发布到事件总线。
Markus(软件开发人员)发言:目前,还没有分布式事务来把数据库更新和消息发布包装到一起。 支付限界上下文
支付限界上下文负责和支付的外部系统交互,进行支付的处理和验证。在V1版本中,支付可以通过模拟的外部第三方支付处理器(模仿PayPal等系统的行为)或发票系统进行处理。外部系统可以报告付款成功或失败。
下图中的序列图演示了支付过程中涉及的关键元素如何相互交互。该图显示了一个简化的视图,忽略了处理程序类以更好地描述流程。
上图显示了订单和注册限界上下文、支付限界上下文和外部支付服务如何相互交互。在未来,注册用户也可以通过发票支付来替代第三方支付服务。
注册者将支付作为UI中整个流程的一部分,如上图所示。PaymentController控制器类先不显示视图,它必须等待系统创建第三方ThirdPartyProcessorPayment聚合实例。它的作用是将从注册者收集的支付信息转发给第三方支付处理程序。
通常,当您实现CQRS模式时,您使用事件作为限界上下文之间通信的机制。然而,在本例中,RegistrationController和PaymentController控制器类向支付限界上下文发送命令。支付限界上下文使用事件与订单和注册限界上下文中的RegistrationProcessManager实例通信。
支付限界上下文的实现使用了CQRS模式,但没有事件源。
写端模型包含一个名为ThirdPartyProcessorPayment的聚合,它由两个类组成:ThirdPartyProcessorPayment和ThirdPartyProcessorPaymentItem。通过使用Entity Framework将这些类的实例持久化到SQL数据库实例中。PaymentsDbContext类实现了一个Entity Framework dbcontext。
ThirdPartyProcessorPaymentCommandHandler是一个在写端实现的命令处理程序。
读取端模型也使用Entity Framework实现。PaymentDao类在读端导出支付数据。请参见GetThirdPartyProcessorPaymentDetails方法。
下图说明了组成支付限界上下文的读端和写端的不同部分。
与在线支付服务的集成、最终的一致性和命令验证通常,在线支付服务提供两种级别的集成方式:
简单的方法是通过一种简单的重定向机制来工作,您不需要与支付提供者建立一个商家帐户。您将客户重定向到支付服务。支付服务接受支付,然后将客户重定向回网站上的一个页面,并附带一个确认码。