首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

基於 WF 4.0 + WCF 構建資料邏輯層:以流程引擎替代傳統 Service Layer 的架構實踐

     編輯:關於.NET

WF 常被誤解為僅是「工作流引擎」,實則是一個具備 IOC、AOP 能力的面向流程控制開發平台。本文展示如何利用 WF 4.0 流程圖 + WCF 服務,構建可視化、可持久化、自帶事務與異常處理的資料邏輯層——這是 COM+ 時代組件服務的現代繼承者。

架構定位:為什麼選 WF 做資料邏輯層?

傳統分層架構:

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 ... */ }
}

業務邏輯流程圖:插入 TableB 的約束檢查

插入 TableB 業務規則流程圖

  1. 檢查 RowID 是否已存在於 TableB → 存在則拋異常
  2. 檢查 ID 是否存在於 TableA → 不存在則拋異常(外鍵約束)
  3. 執行 InsertTableB
  4. 異常捕獲 → 記錄日誌 → 回滾事務

WF 流程圖實作

WF Flowchart 設計介面

流程圖詳細節點

變量定義

流程變量列表

  • inputRow (TableB):輸入參數
  • rowIdExists (bool):TableB RowID 存在檢查結果
  • idExistsInA (bool):TableA ID 存在檢查結果
  • resultMessage (string):回傳訊息

流程節點

  1. FlowDecision: CheckRowID → `DbManager.ExistsInTableB(inputRow.RowID)` → True: 設定錯誤訊息 → End / False: 繼續
  2. FlowDecision: CheckIDInA → `DbManager.ExistsInTableA(inputRow.ID)` → False: 設定錯誤訊息 → End / True: 繼續
  3. InvokeMethod: InsertTableB → `DbManager.InsertTableB(inputRow)` → 設定成功訊息
  4. TryCatch 包裹整個流程:Catch Exception → 記錄日誌 → 設定錯誤訊息 → Rethrow 或吞噬

WCF 服務暴露

[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; // 同步等待流程完成
    }
}

WPF 客戶端調用

加入服務參考

WPF UI 介面

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);
}

執行效果驗證

RowID 重複錯誤

TableA ID 不存在錯誤

插入成功

核心優勢對比:WF vs 傳統 Service Layer

維度傳統 C# Service LayerWF 4.0 Flowchart Layer
約束邏輯可視化程式碼中隱含流程圖即文檔,業務可審閱
修改約束順序重構代碼、重新編譯拖拽節點、熱部署 XAML
事務邊界控制手動 TransactionScopeTryCatch 活動原生支援
長時間執行/持久化需自行實現狀態機內建 SqlWorkflowInstanceStore
並行/補償邏輯複雜 Task/Async 協調Parallel/CompensableActivity 原生
審計追蹤手動寫 LogTracking Participant 自動記錄
版本管理Code DiffXAML Diff 可見業務邏輯變更

進階:異常處理、事務、鎖定在 WF 中的實現

  • 異常捕獲:流程圖最外層包裹 TryCatch 活動,Catch 節點處理記錄與補償
  • 事務:使用 TransactedReceiveScope 或自訂 NativeActivity 包裝 `TransactionScope`
  • 鎖定/並發控制:資料庫層面 `SELECT ... WITH (UPDLOCK, HOLDLOCK)` 或應用層分散式鎖

流程圖外層 TryCatch 異常處理

源碼下載

https://files.cnblogs.com/foundation/WFWCF.rar

總結

WF 4.0 + WCF 不只是「工作流+服務」的疊加,而是將流程控制提升為一等公民的架構風格變革。資料邏輯層的核心複雜度在於「約束與順序」,而非 CRUD 本身。用流程圖外部化約束邏輯,配合 WCF 服務化、持久化追蹤、視覺化設計,構建出可演進、可審計、可維護的現代資料邏輯層——這正是 COM+ 組件服務在 .NET 4.0 時代的最佳繼承與超越。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved