WF 常被誤解為僅是「工作流引擎」,實則是一個具備 IOC、AOP 能力的面向流程控制開發平台。本文展示如何利用 WF 4.0 流程圖 + WCF 服務,構建可視化、可持久化、自帶事務與異常處理的資料邏輯層——這是 COM+ 時代組件服務的現代繼承者。
傳統分層架構:
UI → Service Layer (Business Logic) → Data Access → DB
痛點:Service Layer 中大量 `if-else` 處理關聯約束(外鍵、唯一性、業務規則),真正的 CRUD 代碼反而很少。WF 將「流程控制(約束判斷、順序執行、事務邊界)」外部化為可視化流程圖,Service Layer 退化為純粹的「單表 CRUD 原子操作」。


簡單的兩表關聯:TableA (ID) ← TableB (ID, RowID, Value)
[DataContract] public class TableB {
[DataMember] public string RowID { get; set; }
[DataMember] public string ID { get; set; }
[DataMember] public string Value { get; set; }
}
public static class DbManager {
static string ConnStr = "Data Source=.;Initial Catalog=testDB;Integrated Security=True";
public static bool ExistsInTableA(string id) { /* SELECT ID FROM TableA WHERE ID=@id */ }
public static bool ExistsInTableB(string rowId) { /* SELECT RowID FROM TableB WHERE RowID=@rowId */ }
public static void InsertTableB(TableB row) { /* INSERT INTO TableB ... */ }
}




inputRow (TableB):輸入參數rowIdExists (bool):TableB RowID 存在檢查結果idExistsInA (bool):TableA ID 存在檢查結果resultMessage (string):回傳訊息[ServiceContract]
public interface IDataLogicService {
[OperationContract] string InsertTableB(TableB row);
}
public class DataLogicService : IDataLogicService {
public string InsertTableB(TableB row) {
var wfApp = new WorkflowApplication(new InsertTableBFlowchart());
wfApp.Extensions.Add(new DbManagerExtension()); // 注入 DB 操作
var input = new Dictionary<string, object> { ["inputRow"] = row };
string result = null;
var tcs = new TaskCompletionSource<string>();
wfApp.Completed = e => tcs.SetResult((string)e.Outputs["resultMessage"]);
wfApp.Aborted = e => tcs.SetException(e.Reason);
wfApp.OnUnhandledException = e => tcs.SetException(e.UnhandledException);
wfApp.Run(input);
return tcs.Task.Result; // 同步等待流程完成
}
}


private void btnInsert_Click(object sender, RoutedEventArgs e) {
var client = new DataLogicServiceClient();
var row = new TableB { ID = txtID.Text, RowID = txtRowID.Text, Value = txtValue.Text };
string msg = client.InsertTableB(row);
MessageBox.Show(msg);
}



| 維度 | 傳統 C# Service Layer | WF 4.0 Flowchart Layer |
|---|---|---|
| 約束邏輯可視化 | 程式碼中隱含 | 流程圖即文檔,業務可審閱 |
| 修改約束順序 | 重構代碼、重新編譯 | 拖拽節點、熱部署 XAML |
| 事務邊界控制 | 手動 TransactionScope | TryCatch 活動原生支援 |
| 長時間執行/持久化 | 需自行實現狀態機 | 內建 SqlWorkflowInstanceStore |
| 並行/補償邏輯 | 複雜 Task/Async 協調 | Parallel/CompensableActivity 原生 |
| 審計追蹤 | 手動寫 Log | Tracking Participant 自動記錄 |
| 版本管理 | Code Diff | XAML Diff 可見業務邏輯變更 |
TryCatch 活動,Catch 節點處理記錄與補償TransactedReceiveScope 或自訂 NativeActivity 包裝 `TransactionScope`
https://files.cnblogs.com/foundation/WFWCF.rar
WF 4.0 + WCF 不只是「工作流+服務」的疊加,而是將流程控制提升為一等公民的架構風格變革。資料邏輯層的核心複雜度在於「約束與順序」,而非 CRUD 本身。用流程圖外部化約束邏輯,配合 WCF 服務化、持久化追蹤、視覺化設計,構建出可演進、可審計、可維護的現代資料邏輯層——這正是 COM+ 組件服務在 .NET 4.0 時代的最佳繼承與超越。