首先,我不完全確定我理解你的問題,所以讓我說出我的假設,然後提供我的答案。必要時適應。
假設:
- 你的業務流程模型操作的集合。例如:A可能是結賬步驟,C和C'是兩個不同但相似的付款步驟。
- 每個過程步驟在公用數據集的不同部分上運行。例如:B計算總計和折扣(對購物車內容進行操作),C和C'獲取總計並啓動某種付款。
- 您希望儘可能保持原有實現的完整性。
如果是這種情況,我會確保我對我的數據模型有正確的理解,並且每個步驟的哪些部分可以運行,然後圍繞此建立一個狀態機。
優點:
- 您的每個過程的步驟可以使用一個或多個國家進行建模。您確保轉換基於數據模型。您可以根據用戶使用Paypal付款或兌換憑證的決定,決定是否將用戶轉換到適當的狀態來處理此問題。
- 各州可以單獨進行測試。單元測試將很容易編寫,您可以爲面向客戶的功能構建線束以進行手動測試(例如與支付提供商進行集成測試)。
- 狀態機通常佔用空間很小。它們通常是事件驅動的,因此可以在應用程序中保持線程數減少。如果狀態只包含邏輯並僅對數據對象進行操作,則甚至可以在不同的併發進程間重複使用狀態實例。這取決於你的狀態機框架。
事情要記住:
- 在你的狀態明確,並有許多小國進行小型專用操作。如果決定使用卡支付或優惠券,則將其設爲僞狀態。
- 避免上帝對象(即包含知道所有事物的對象)。如果狀態開始在大部分域模型上運行,請考慮改進模型或狀態機
- 確保使所有事件都是事件驅動的並且是異步的。同步狀態機不會擴展。如果您正在調用不是異步的服務,請爲其構建一個包裝器。
我已經成功地在先前的項目中使用了這種建模業務流程的方法。這是最終用戶可以購買物品的流程。我們需要處理大量替代流程,例如在不同的支付方式之間切換,在後端系統不可用時重試等等。
爲了滿足我們的需求,我們推出了自己的狀態機框架。你應該看看你的平臺有什麼可用的。
感謝您的建議,但我正在使用的應用程序已經5年了,因此我無法選擇新技術。 – 2012-07-30 04:04:02
您通常可以將抽象放在系統中的任何邊界上。我們最近已經將Windows Workflow與一個應用程序集成在一起,這個應用程序有15年的COM和9年的.NET。 – pointyhat 2012-08-09 16:07:32