CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)

旅程4:扩展和增强订单和注册限界上下文 进一步探索订单和注册的有界上下文。 “我明白,如果一个人想看些新鲜的东西,旅行并不是没有意义的。”儒勒·凡尔纳,环游世界80天 对限界上下文的更改:

前一章详细描述了订单和注册限界上下文。本章描述了在CQRS之旅的第二阶段,团队在这个限界上下文中所做的一些更改。

本章的主题包括:

改进RegistrationProcessManager类中消息相关的工作方式。这说明了限界上下文中的聚合实例如何以复杂的方式进行交互。

实现一个记录定位器,使注册者能够检索她在前一个会话中保存的订单。这说明了如何向写端(Write Side)添加一些额外的逻辑,使您能够在不知道聚合实例惟一ID的情况下定位它。

在UI中添加一个倒计时器,使注册者能够跟踪他们需要在多长时间内完成订单。这说明了对写端(Write Side)进行的增强,以支持在UI中显示丰富的信息。

同时支持多种座位类型的预定。例如,注册者为会前的活动申请5个座位,为会议申请8个座位。这需要在写端(Write Side)使用更复杂的业务逻辑。

CQRS命令验证。这说明了如何在将CQRS命令发送到领域之前使用MVC中的模型验证特性来验证它们。

本章描述的Contoso会议管理系统并不是该系统的最终版本。本旅程描述的是一个过程,因此一些设计决策和实现细节将在过程的后续步骤中更改。这些变化将在后面的章节中描述。

本章的工作术语定义:

本章使用了一些术语,我们将在下一章进行描述。有关更多细节和可能的替代定义,请参阅参考指南中的“深入CQRS和ES”。

Command(命令):命令是要求系统执行更改系统状态的操作。命令是必须服从(执行)的一种指令,例如:MakeSeatReservation。在这个限界上下文中,命令要么来自用户发起请求时的UI,要么来自流程管理器(当流程管理器指示聚合执行某个操作时)。单个接收方处理一个命令。命令总线(command bus)传输命令,然后命令处理程序将这些命令发送到聚合。发送命令是一个没有返回值的异步操作。

Event(事件):事件就是系统中发生的一些事情,通常是一个命令的结果。领域模型中的聚合会引发(raise)事件。多个事件订阅者(subscribers)可以处理特定的事件。聚合将事件发布到事件总线, 处理程序订阅特定类型的事件,事件总线(event bus)将事件传递给订阅者。在这个限界上下文中,唯一的订阅者是流程管理器。

流程管理器。在这个限界上下文中,流程管理器是一个协调领域域中聚合行为的类。流程管理器订阅聚合引发的事件,然后遵循一组简单的规则来确定发送一个或一组命令。流程管理器不包含任何业务逻辑,它唯一的逻辑是确定下一个发送的命令。流程管理器被实现为一个状态机,因此当它响应一个事件时,除了发送一个新命令外,还可以更改其内部状态。

Gregor Hohpe和Bobby Woolf合著的《Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions》(Addison-Wesley Professional, 2003)书中312页讲述了流程管理器实现模式。我们的流程管理器就是依照这个模式实现的。

用户故事(User stories)

除了描述订单和注册限界上下文的一些更改和增强之外,本章还讨论了两个用户故事的实现。

使用记录定位器作为登录

当注册者创建会议座位的订单时,系统生成一个5个字符的订单访问代码,并通过电子邮件发送给注册者。登记人可以使用她的电子邮件地址和会议系统网站上的订单访问代码作为记录定位器,以便稍后从系统中检索订单。注册者可能希望检索订单以查看它,或者通过分配与会者到座位来完成注册过程。

Carlos(领域专家)发言:

从商业的角度来看,对我们来说,尽可能地做到用户友好是很重要的。我们不想阻止或不必要地增加任何试图注册会议的人的负担。因此,我们不要求用户在注册之前在系统中创建帐户,特别是要求用户无论如何都必须在标准的结帐过程中输入大部分信息。

告诉会议注册者还剩余多少时间来完成订单

当注册者创建一个订单时,系统将保留注册者请求的座位,直到完成订单或预订过期。要完成订单,注册者必须提交她的详细信息,如姓名和电子邮件地址,并成功付款。

为了帮助注册者,系统会显示一个倒计时计时器,告诉她还有多少时间可以在预定到期前完成订单。

使注册者能够创建包含多个座位类型的订单

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

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