該應用程序需要三個組件: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 的客戶是否存在。