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

Windows Workflow Foundation 進階教學:第十六章 - 宣告式工作流與 XAML

     編輯:關於.NET

本章學習目標

  • 理解命令式 (Imperative) 與宣告式 (Declarative) 工作流模型的差異
  • 建立宣告式工作流
  • 使用 XAML XML 詞彙定義工作流
  • 載入並執行基於 XAML 的工作流

兩種工作流定義風格

WF 支援兩種定義方式:

  • 命令式 (設計工具/程式碼):工作流編譯進組件,載入執行快,但修改業務邏輯需重新編譯、部署、測試。
  • 宣告式 (XAML/.xoml):工作流定義為 XML 檔案,可使用任何文字編輯器修改,無需重新編譯即可部署;亦可透過 wfc.exe 編譯為組件以兼顧效能。

XAML 基礎與命名空間

XAML (XML Application Markup Language) 同樣用於 WPF。WF 習慣使用 .xoml 副檔名區分工作流定義。

必要命名空間宣告

<SequentialWorkflowActivity x:Name="Workflow1"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/workflow">
    ...
</SequentialWorkflowActivity>
  • xmlns:x:XAML 語言命名空間 (慣用 x: 前綴)。
  • xmlns (預設):WF 工作流命名空間,元素名稱直接對應活動類型 (如 CodeActivity、IfElseActivity)。

引用 CLR 命名空間與組件

使用 clr-namespace 與 assembly 關鍵字:

xmlns:sys="clr-namespace:System;assembly=System"

自訂活動需在組件加上 [assembly: XmlnsDefinition("urn:MyXmlNamespace", "MyNamespace")],XAML 中再以 xmlns:custom="urn:MyXmlNamespace" 參考。

直接載入 XAML 執行

  1. 在專案加入 Workflow1.xml (設定「複製到輸出目錄」為「如果較新則複製」)。
  2. 撰寫 XAML 定義 (範例:含 DelayActivity 的循序工作流)。
  3. 宿主程式使用 XmlTextReader 載入:
XmlTextReader rdr = new XmlTextReader("Workflow1.xml");
WorkflowInstance instance = workflowRuntime.CreateWorkflow(rdr);
instance.Start();

加入 XML 檔案

設定複製到輸出目錄

直接執行 XAML 結果

限制: 直接執行 XAML 無法傳遞初始化參數,亦無法內嵌複雜 C# 邏輯 (建議使用自訂組件或程式碼後置)。

編譯 XAML (wfc.exe) 並傳遞參數

  1. 將檔案重命名為 Workflow1.xoml,根元素加上 x:Class="Workflow1"。
  2. 命令列執行:
    "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Wfc.exe" Workflow1.xoml
  3. 產生 Workflow1.dll,專案加入參考。
  4. 宿主程式以型別建立實例並傳遞參數字典:

Dictionary<string, object> parms = new Dictionary<string, object>();
parms.Add("PostalCode", args.Length > 0 ? args[0] : "");
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1), parms);
instance.Start();

加入編譯後組件參考

執行結果:有效郵遞區號

執行結果:無效郵遞區號

程式碼後置檔案

慣例命名 Workflow1.xoml.cs,包含部分類別實作邏輯 (如 EvaluatePostalCode、PostalCodeValid)。wfc.exe 可同時編譯 .xoml 與 .xoml.cs。

使用自訂活動與 XmlnsDefinition

  1. 建立活動庫專案 XmlnsDefLib,加入 PrintMessageActivity (繼承 Activity、含 Message 相依屬性、覆寫 Execute)。
  2. 在組件加上 [assembly: XmlnsDefinition("urn:PrintMessage", "XmlnsDefLib")]。
  3. 工作流 XAML 引用:xmlns:custom="urn:PrintMessage",使用 <custom:PrintMessageActivity Message="Hello!" />。
  4. 編譯活動庫,工作流專案參考該組件。
  5. 執行 wfc.exe 並指定參考組件:
    Wfc.exe Workflow1.xoml /r:..\XmlnsDefLib\bin\Debug\XmlnsDefLib.dll
  6. 主專案參考產生的 Workflow1.dll 執行。

加入工作流活動庫專案

加入專案參考

編譯後組件參考

自訂活動執行結果

本章小結

宣告式工作流讓業務流程定義與程式碼分離,支援動態修改與部署。本章涵蓋 XAML 命名空間規則、直接載入與編譯執行兩種模式、參數傳遞、程式碼後置、自訂活動整合與 XmlnsDefinition 使用。視專案需求選擇適當模式:頻繁變動的流程適合純 XAML;追求效能或需強型別參數則編譯為組件。

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