该应用程序需要三个组件:OrderProcessing、Shipping 和 CustomerCheck,如图 8 所示。这些组件将包含在 OrderProcessing 模块中。CustomerCheck 组件依赖于某个企业信息系统以获取客户状态。实际的订单装运为手动处理,因此需要附加的组件来允许员工查看需装运的订单,并允许他们表明订单已于何时装运。图 8 中的编号表示接收到订单之后的执行顺序,这里假设客户已经存在。在下一部分之后,将介绍有关每个组件及其如何工作的细节。接下来的部分列出了组件所需的业务对象。
Order 业务对象
图 9 显示了 Order 业务对象。当该对象类型的实例被传递给 OrderProcessing 模块时,它将包含完成客户检查和装运订单所需的全部信息。在实际的应用中,您可能需要创建独立的 Customer 业务对象来保存客户 ID 字符串之外的客户信息。
OrderProcessing 组件
OrderProcessing 组件是系统的入口点,它在从客户端应用程序接收到订单之后,驱动 OrderProcessing 模块。该组件接收到一个 Order 业务对象,其中包含订单信息以及客户帐号。OrderProcessing 组件使用该帐号通过 CustomerInformation 组件来确定对应的帐户是否存在。如果存在,它将向 Shipping 组件发送一条消息以装运订单。如果帐户不存在,则整个流程结束。
图 10 显示了 ProcessOrder 组件的接口。客户端调用 placeOrder 操作以开始订单处理。该操作以 Order 业务对象作为输入。我们只要求客户端能提供订单,然后执行其他工作,因此该操作是单向的。注意,外部客户端不能直接调用 placeOrder 操作,因为只有同一模块中的组件才能与其连线。这样,外部客户端必须使用连线到 OrderProcessing 组件的独立引用。当 ShippingProcess 组件需要发送订单已装运的消息时,它将调用 orderShipped 操作。
由于 OrderProcessing 组件是事件驱动的,即由正在处理的订单状态确定所允许的操作,我们将使用业务状态机来进行实现,如图 11 所示。这些事件包括:
通知订单已装运(装运系统调用 orderShipped 操作)
这些状态包括:
等待订单
正在检查客户
正在装运订单
订单完成
在状态机中有多种方式对此应用程序进行建模,由于我们假设当接收到订单时,它将在转移到 CustomerBeingChecked 状态时自动触发客户检查,因此我们选择这种建模方式。检查结果自动触发到 OrderBeingShipped 或 OrderComplete 状态的转换,具体取决于在 CustomerBeingChecked 状态时调用 CustomerCheck 服务返回的结果值。在处于 OrderBeingShipped 状态时,Shipping 组件调用 ShippingProcess 组件的 shipOrder 操作。当接收到来自 Shipping 组件订单已装运通知时,系统自动转换到 OrderComplete 状态。
CustomerInformation 组件
图 12 显示了 CustomerInformation 组件的接口。该组件确定具有给定 customerID 的客户是否存在。