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

WF4.0 基礎篇(29):WorkflowInspectionServices 深度解析活動樹結構

     編輯:關於.NET

WF4.0 的活動樹結構遠比 WF3.x 複雜,活動可能擁有 Activities、Body、Implementation 等多種子活動屬性,手寫遞迴遍歷極易遺漏。WorkflowInspectionServices 類別正是為了解決此痛點而設計,能自動判斷並遍歷活動樹上的所有活動節點。

核心功能與限制

  • 自動遍歷:無需手寫遞迴判斷 Activities/Body/Implementation,一次取得所有活動。
  • 無法取得 Flowchart 專用節點:FlowNode、FlowStep、FlowSwitch、FlowDecision 不繼承自 Activity,故無法直接取得,但其內部包含的 Activity 仍可被發現。

WorkflowInspectionServices 類別結構

靜態方法:GetActivities - 快速列印活動樹

static void PrintActivityTree(Activity activity, string indent)
{
    Console.WriteLine($"{indent}{activity.DisplayName}, Type: {activity.GetType()}");
    foreach (var child in WorkflowInspectionServices.GetActivities(activity))
    {
        PrintActivityTree(child, " " + indent);
    }
}

搭配 XAML 載入與 CacheMetadata 驗證:

static Activity GetActivity(string filePath)
{
    string xaml = File.ReadAllText(filePath);
    var activity = ActivityXamlServices.Load(new StringReader(xaml));
    WorkflowInspectionServices.CacheMetadata(activity);
    return activity;
}

對比:手寫遞迴可操作更多細節

自訂遞迴可針對 Sequence 列印變數、DynamicActivity 列印屬性與實作、VisualBasicValue 顯示運算式文本等,適合需深度分析的場景。

四大範例實測

  1. Sequence 巢狀:Sequence 巢狀結果 手寫遞迴結果
  2. If 容器:If 容器結果 手寫遞迴結果
  3. Flowchart:Flowchart 結果 手寫遞迴結果(驗證 FlowNode 不被 GetActivities 取得)
  4. 自訂 Activity:自訂 Activity 結果 手寫遞迴結果

操作 WCF 服務中的工作流 (XAMLX)

var fs = new FileStream("Service1.xamlx", FileMode.Open);
var wfs = (WorkflowService)XamlServices.Load(fs);
PrintActivityTree(wfs.Body, "|--");

Resolve 方法:依 ID 精準定位活動

var act = WorkflowInspectionServices.Resolve(wf, "1.5");
Console.WriteLine($"{act.Id}, {act.DisplayName}");

Resolve 定位結果

CacheMetadata 方法:活動驗證利器

驗證活動定義正確性,失敗拋出例外,建議包在 Try-Catch 中:

try {
    WorkflowInspectionServices.CacheMetadata(new MyActivityA());
    Console.WriteLine("驗證通過");
} catch (Exception ex) {
    Console.WriteLine(ex.Message);
}

CacheMetadata 驗證結果

配套原始碼:下載連結

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