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

WF 核心教學第八章(下):外部方法調用與工作流啟動實戰

     編輯:關於.NET

承接上集,本文將完成「機動車資料查詢」應用程式的後端橋接服務建構,並示範如何使用 wca.exe 工具自動生成通訊活動,最後介紹 InvokeWorkflow 活動實現工作流巢狀調用。

建立外部資料服務:橋接器與服務類

工作流執行於運行時範圍內,宿主無法直接存取已持久化或非執行狀態的實例。因此需建立「橋接代碼」:Connector(連接器) 實現通訊介面並維持資料狀態;Service(服務類) 註冊服務、管理單例、提供 Read() 與事件觸發方法。

1. MVDataConnector 連接器類

  • 實作 IMVDataService 介面,包含 _dataValue 儲存工作流傳回的 DataSet。
  • 靜態屬性 MVDataService 以雙重檢查鎖定確保執行緒安全的單例模式。
  • MVDataUpdate(DataSet) 方法:儲存資料並呼叫 _service.RaiseMVDataUpdateEvent() 通知宿主。
public sealed class MVDataConnector : IMVDataService {
    private DataSet _dataValue = null;
    private static WorkflowMVDataService _service = null;
    private static object _syncLock = new object();
    // 靜態屬性 MVDataService、MVData 屬性、MVDataUpdate 方法...
}

2. WorkflowMVDataService 服務類

  • 靜態欄位:_workflowRuntime、_dataExchangeService、_dataConnector、_syncLock。
  • 事件 MVDataUpdate:宿主訂閱以接收資料就緒通知。
  • 工廠方法 CreateDataService(Guid, WorkflowRuntime):註冊 ExternalDataExchangeService、建立/重用 Connector、綁定 Service 實例、更新 InstanceID。
  • Read() 回傳 Connector 中的 DataSet;RaiseMVDataUpdateEvent() 觸發事件並載入持久化實例。
public class WorkflowMVDataService {
    // 靜態欄位、事件、InstanceID 屬性
    public static WorkflowMVDataService CreateDataService(...) { ... }
    public static WorkflowMVDataService GetRegisteredWorkflowDataService(...) { ... }
    private WorkflowMVDataService(Guid instanceID) { ... }
    ~WorkflowMVDataService() { ... }
    public DataSet Read() { return _dataConnector.MVData; }
    public void RaiseMVDataUpdateEvent() { ... }
}

wca.exe 執行輸出 生成檔案列表 加入 MVDataUpdate.cs 到專案 工具箱中的 MVDataUpdate 活動 工作流設計器配置 MVDataUpdate

使用 wca.exe 生成自訂通訊活動

  1. 確保 MVDataService.dll 編譯無誤。
  2. 開啟命令提示字元,切換至組件目錄。
  3. 執行 "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Wca.exe" MVDataService.dll。
  4. 生成 IMVDataService.Invokes.cs(發送資料活動)與 IMVDataService.Sinks.cs(接收資料,本範例忽略)。
  5. 重命名 Invokes.cs 為 MVDataUpdate.cs,移至工作流專案並加入專案。
  6. 編譯工作流專案,工具箱即出現 MVDataUpdate 活動。

配置工作流通訊活動

  1. 開啟 Workflow1.cs 設計器,拖曳 MVDataUpdate 至 Code 活動(產生 DataSet)之後。
  2. 切換代碼視圖,在 GenerateMVDData 方法中指派資料:mvDataUpdate1.mvData = ds;。

宿主應用程式接收工作流資料

在 Form1.cs 中:

  1. cmdRetrieve_Click 建立工作流實例後,呼叫 WorkflowMVDataService.CreateDataService 註冊服務,並訂閱 MVDataUpdate 事件。
  2. 事件處理器 dataService_MVDataUpdate 使用 BeginInvoke 切換至 UI 執行緒,呼叫 GetRegisteredWorkflowDataService 取得服務,再呼叫 Read() 取得 DataSet,逐行繫結至 ListView。
// 關鍵片段
MVDataService.WorkflowMVDataService dataService = 
    MVDataService.WorkflowMVDataService.CreateDataService(_workflowInstance.InstanceId, _workflowRuntime);
dataService.MVDataUpdate += new EventHandler<MVDataService.MVDataAvailableArgs>(dataService_MVDataUpdate);

// 事件處理器中
DataSet ds = dataService.Read();
// 繫結 Vehicles 與 Violations 表格至 ListView

InvokeWorkflow 活動:在工作流中啟動另一個工作流

WF 支援巢狀工作流調用。範例建立兩個順序工作流庫專案 Workflow1、Workflow2,各含一 Code 活動輸出問候語。在 Workflow1 中拖曳 InvokeWorkflow,設定 TargetWorkflow 為 Workflow2.Workflow2。主控制台應用程式啟動 Workflow1,即可觀察到兩個工作流依序完成。

  1. 建立 Workflow1、Workflow2 專案,各加入 Code 活動輸出訊息。
  2. Workflow1 參考 Workflow2,設計器加入 InvokeWorkflow 並指定目標類型。
  3. 主程式 Program.cs 建立 Workflow1 實例並啟動。
  4. WorkflowCompleted 事件中判斷完成的工作流類型並輸出日誌。

InvokeWorkflow 活動 選擇 TargetWorkflow 瀏覽 .NET 類型對話框 InvokeWorkflow 內部顯示子工作流 控制台輸出結果

重點回顧:橋接器/服務模式解耦工作流與宿主;wca.exe 自動生成強型別活動;InvokeWorkflow 實現工作流組合與復用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved