承接上集,本文將完成「機動車資料查詢」應用程式的後端橋接服務建構,並示範如何使用 wca.exe 工具自動生成通訊活動,最後介紹 InvokeWorkflow 活動實現工作流巢狀調用。
工作流執行於運行時範圍內,宿主無法直接存取已持久化或非執行狀態的實例。因此需建立「橋接代碼」:Connector(連接器) 實現通訊介面並維持資料狀態;Service(服務類) 註冊服務、管理單例、提供 Read() 與事件觸發方法。
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 方法...
}
_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() { ... }
}

MVDataService.dll 編譯無誤。"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Wca.exe" MVDataService.dll。IMVDataService.Invokes.cs(發送資料活動)與 IMVDataService.Sinks.cs(接收資料,本範例忽略)。Invokes.cs 為 MVDataUpdate.cs,移至工作流專案並加入專案。MVDataUpdate 活動。Workflow1.cs 設計器,拖曳 MVDataUpdate 至 Code 活動(產生 DataSet)之後。GenerateMVDData 方法中指派資料:mvDataUpdate1.mvData = ds;。在 Form1.cs 中:
cmdRetrieve_Click 建立工作流實例後,呼叫 WorkflowMVDataService.CreateDataService 註冊服務,並訂閱 MVDataUpdate 事件。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
WF 支援巢狀工作流調用。範例建立兩個順序工作流庫專案 Workflow1、Workflow2,各含一 Code 活動輸出問候語。在 Workflow1 中拖曳 InvokeWorkflow,設定 TargetWorkflow 為 Workflow2.Workflow2。主控制台應用程式啟動 Workflow1,即可觀察到兩個工作流依序完成。
Workflow1、Workflow2 專案,各加入 Code 活動輸出訊息。Workflow1 參考 Workflow2,設計器加入 InvokeWorkflow 並指定目標類型。Program.cs 建立 Workflow1 實例並啟動。WorkflowCompleted 事件中判斷完成的工作流類型並輸出日誌。

重點回顧:橋接器/服務模式解耦工作流與宿主;wca.exe自動生成強型別活動;InvokeWorkflow實現工作流組合與復用。