CQRS之旅——旅程5(准备发布V1版本) (8)

CQRS之旅——旅程5(准备发布V1版本)

Carlos(领域专家)发言:

只要注册者知道更改已经被持久化,并且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类将这些事件发布到事件总线。

CQRS之旅——旅程5(准备发布V1版本)

Markus(软件开发人员)发言:

目前,还没有分布式事务来把数据库更新和消息发布包装到一起。

支付限界上下文

支付限界上下文负责和支付的外部系统交互,进行支付的处理和验证。在V1版本中,支付可以通过模拟的外部第三方支付处理器(模仿PayPal等系统的行为)或发票系统进行处理。外部系统可以报告付款成功或失败。

下图中的序列图演示了支付过程中涉及的关键元素如何相互交互。该图显示了一个简化的视图,忽略了处理程序类以更好地描述流程。

上图显示了订单和注册限界上下文、支付限界上下文和外部支付服务如何相互交互。在未来,注册用户也可以通过发票支付来替代第三方支付服务。

注册者将支付作为UI中整个流程的一部分,如上图所示。PaymentController控制器类先不显示视图,它必须等待系统创建第三方ThirdPartyProcessorPayment聚合实例。它的作用是将从注册者收集的支付信息转发给第三方支付处理程序。

通常,当您实现CQRS模式时,您使用事件作为限界上下文之间通信的机制。然而,在本例中,RegistrationControllerPaymentController控制器类向支付限界上下文发送命令。支付限界上下文使用事件与订单和注册限界上下文中的RegistrationProcessManager实例通信。

支付限界上下文的实现使用了CQRS模式,但没有事件源。

写端模型包含一个名为ThirdPartyProcessorPayment的聚合,它由两个类组成:ThirdPartyProcessorPaymentThirdPartyProcessorPaymentItem。通过使用Entity Framework将这些类的实例持久化到SQL数据库实例中。PaymentsDbContext类实现了一个Entity Framework dbcontext。

ThirdPartyProcessorPaymentCommandHandler是一个在写端实现的命令处理程序。

读取端模型也使用Entity Framework实现。PaymentDao类在读端导出支付数据。请参见GetThirdPartyProcessorPaymentDetails方法。

下图说明了组成支付限界上下文的读端和写端的不同部分。

与在线支付服务的集成、最终的一致性和命令验证

通常,在线支付服务提供两种级别的集成方式:

简单的方法是通过一种简单的重定向机制来工作,您不需要与支付提供者建立一个商家帐户。您将客户重定向到支付服务。支付服务接受支付,然后将客户重定向回网站上的一个页面,并附带一个确认码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgxy.html