本章將引導您掌握 Windows Workflow Foundation (WF) 中基於規則的處理機制,重點包括:
大多數開發者翣慣編寫命令式代碼——透過 C# 明確指定業務邏輯的每一步執行順序,例如讀取資料庫、計算數值、寫入結果。然而,當業務規則變得複雜且多變時,巢狀的 if-else 與 switch 語句會使代碼難以維護、擴展與重用。
WF 提供了聲明式規則引擎,讓您以「如果條件則動作」的規則集合描述業務邏輯,而非硬編碼執行步驟。規則在運行時由引擎解釋執行,支援動態修改,無需重新編譯部署,極大提升了業務邏輯的靈活性。
WF 中的規則遵循 IF 條件 THEN 動作 ELSE 動作 結構,條件返回布林值,動作可包含多個操作。規則引擎負責評估條件並根據結果執行對應動作。規則以 XML 形式儲存,編譯為資源嵌入組件。
策略是規則的集合,封裝在 RuleSet 物件中。策略支援優先級、啟用狀態與前向鏈接控制,使多規則協同工作成為可能。
前向鏈接是指規則評估結果導致狀態變更,進而觸發其他依賴規則重新評估的機制。WF 提供三種鏈接模式:
| 模式 | 說明 |
|---|---|
| 隱式鏈接 | 引擎自動偵測規則間共享欄位/屬性的讀寫依賴 |
| 屬性聲明鏈接 | 透過 [RuleWrite]、[RuleRead]、[RuleInvoke] 屬性明確標記方法對欄位的影響 |
| 顯式鏈接 | 在規則中使用 Update("欄位名") 語句手動通知引擎狀態已變更 |
此外,可透過 Full Chaining(預設)、Explicit Chaining、Sequential 三種控制行為微調鏈接範圍,並以 Always(預設)或 Never 重新評估模式防止無限循環。
IfElse、While、Replicator、ConditionedActivityGroup 等活動原本使用代碼條件(事件處理器返回 ConditionalEventArgs.Result)。現在可改用聲明性規則條件,直接在設計器中編寫如 System.DateTime.Now.DayOfWeek == System.DayOfWeek.Tuesday 的運算式,支援關係、算術、邏輯運算子與關鍵字(IF/THEN/ELSE/HALT/Update)。
優勢在於規則外部化,可在運行時熱替換,無需重新部署組件。
當單一規則不足以表達業務邏輯時,Policy 活動登場。它承載一個 RuleSet,透過專用編輯器批量管理規則,設定優先級、鏈接行為與重新評估模式。本章以塑膠製造商訂單處理為例,示範如何將四條業務規則封裝為策略:
實戰中,透過 CheckPlasticizer()、CheckActualPlasticizer() 方法封裝邏輯,配合 [RuleWrite("_shipQty")] 標記狀態變更,Policy 活動自動處理前向鏈接,優雅解決了「預估庫存充足但實際不足」的動態決策問題。
結果證明:基於規則的方式將原本需要大量巢狀活動的複雜邏輯簡化為幾條可維護、可熱插拔的規則,極大降低了業務變更成本。
WF 的規則引擎將業務邏輯與流程控制分離,支援聲明式定義、動態更新與前向鏈接自動推理。實際專案中,建議將穩定流程用命令式活動實現,將易變業務規則外部化為 Policy 活動,兩者結合達到最佳平衡。