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

WF 從入門到精通(第四章):深入解析活動與工作流類型

     編輯:關於.NET

學習目標

本章將帶您掌握以下核心概念:

  • Workflow 活動的形成機制
  • 順序工作流與狀態機工作流的本質區別
  • 如何創建順序工作流
  • 如何創建狀態機工作流

活動:工作流處理的基本單元

活動是 WF 中工作流處理的最小單位。當我們將一個複雜的業務流程分解時,會發現它由許多更小、更專注的子任務組成。例如,一個需要將資料傳送至多個處理系統的大型任務,其子任務可能包括:從資料庫讀取資料、利用資料生成文件、透過 FTP 或 XML Web Service 將文件傳送至遠端伺服器、標記資訊已處理(如寫入資料庫並進入審計步驟)等。每個子任務都專注於特定功能——讀取資料庫、上傳文件、執行審計,這些就是活動。

創建工作流時,我們將這些獨立活動串聯起來,定義它們之間的轉換邏輯。部分活動可作為容器承載其他活動(如根活動),另一些則執行單一具體任務。根活動既可以是順序活動,也可以是狀態機活動,本章將詳細說明這些類型。

活動如何知道下一步做什麼?

活動之間的流轉邏輯主要有兩種模式:一是按照創建根活動時指定的順序執行;二是僅在特定事件發生後觸發指定活動。為了深入理解,我們首先需要認識 WF Activity 物件,再探討活動如何鏈接。

Activity 物件:基本工作單元

WF 提供了 Activity 基類,雖然它看似簡單,但實現了工作流間複雜的互動機制。所有自訂活動均繼承自 Activity 類,賦予強大功能。自訂活動的創建將在第 13 章詳細介紹,而本書第二部分(第 7-13 章)均圍繞活動展開。

表 4-1:Activity 主要屬性

屬性功能
Description獲取或設定使用者定義的活動描述
Enabled獲取或設定實例是否可執行和驗證
ExecutionResult獲取最後執行結果(Canceled、Compensated、Faulted、None、Succeeded)
ExecutionStatus獲取工作流狀態(Canceling、Closed、Compensating、Executing、Faulting、Initialized)
Name獲取或設定活動實例名稱
Parent獲取包含該活動的父活動
WorkflowInstanceId獲取相關工作流實例的識別碼

表 4-2:Activity 常用方法

方法功能
Cancel取消活動執行
Clone返回活動的深層複製
Execute同步執行活動
GetActivityByName在組合活動中按名稱查找子活動
Load從流載入活動實例
RaiseEvent觸發與指定相依屬性關聯的事件
RaiseGenericEvent<T>泛型版本的事件觸發
Save將活動儲存至流

這些方法多為虛擬且受保護,旨在讓開發者覆寫以滿足自訂需求。其中 Execute 方法最為關鍵,工作流運行時調用它即啟動活動執行。

活動的兩大分類

  • 組合活動:包含其他活動。典型例子是貫穿全書的 Sequential 活動(順序工作流中所有活動的載體,創建順序工作流時 VS 自動創建)。
  • 基本活動:執行單一任務,如 Delay 活動和 Code 活動。最終由基本活動承載具體業務邏輯,組合活動負責協調流程與資料流向。

ActivityExecutionContext 物件

許多 Activity 方法需要 ActivityExecutionContext 物件作為參數。它由工作流運行時在工作流實例入隊時創建,開發者無需直接實例化。它提供活動與工作流實例互動所需的方法與服務(初始化、計時器、執行流產生),本質上是輔助物件,類似 ASP.NET 中的 HttpContext。

相依屬性

WF 大量使用相依屬性以便於活動綁定。傳統屬性由類別內部欄位支撐,但 WF 和 WPF 需頻繁訪問屬性進行資料綁定、佈局渲染等。ActivityBind 類簡化了活動間的屬性綁定。

活動驗證

活動具備驗證能力。例如 IfElse 活動未指定分支條件時,VS 會報錯。編譯帶驗證錯誤的程式碼會失敗,必須修正後才能執行。

工作流類型

工作流應用程式類型很大程度上取決於根活動的選擇。雖然新專案對話框僅顯示兩種模板,但實際存在三種主要類型:

1. 順序工作流

活動按指定順序依次執行。根活動為 SequentialWorkflowActivity。適合自主執行、極少外部控制、用戶交互較少的業務處理(如資料讀取、處理、通知、寫入結果)。雖可處理審批等交互,但非核心關注點。

2. 狀態機工作流

嚴重依賴外部事件驅動狀態轉換。根活動為 StateMachineWorkflowActivity。適合大量用戶交互場景:工作流發送通知等待響應(批准、選擇選項等),事件觸發狀態轉換。詳細內容見第 14 章。

3. 基於規則的工作流

基於 Policy 活動與規則條件,依業務規則判斷轉換邏輯。根活動為順序活動,無獨立專案模板,需從順序工作流起步再加入規則活動。第 12 章詳細介紹。

選擇指南(表 4-3)

工作流類型適用條件
順序工作流任務自主執行,少量或無用戶交互,工作流自身控制執行
狀態機工作流嚴重依賴外部控制,大量用戶/外部系統交互,事件驅動狀態轉換
基於規則的工作流包含複雜判斷條件,非順序或狀態機模式可描述,根可為順序或狀態機

實際專案中常組合使用三種類型。選擇最適合的類型構建系統。

深入順序活動

順序活動按指定順序執行,如同依清單辦事。VS 設計器中從上到下的佈局即代表執行順序。順序活動本身也是組合活動。雖本書不演示動態添加活動,但技術上可行。

創建順序工作流應用程式

  1. 開啟 Visual Studio 2008
  2. 「檔案」→「新增專案」
  3. 展開 Visual C# 節點,選擇 Workflow 範本
  4. 選擇「順序工作流控制台應用程式」或「順序工作流程式庫」
  5. 輸入專案名稱與路徑
  6. 點擊「確定」,VS 建立基礎專案含設計器

之後可從工具箱拖放活動、調整屬性。需增加工作流程式庫項目時,參考前章說明或直接新增工作流類別。

狀態機活動

第 14 章專門講解狀態機工作流,本節介紹核心概念並快速創建範例。

有限狀態機概念

「有限狀態機」包含三要素:有限(狀態數量有限)、狀態(事件觸發時的邏輯條件)、機器(自動化)。以自動販賣機為例:

  • 狀態用圓表示(等待投幣、等待選擇、完成等)
  • 轉換用箭頭表示,由事件觸發(投幣、選擇商品)
  • 有邏輯起點與一個或多個終點(雙圓表示)
  • 防止無效狀態(如收錢不出貨)

圖 4-2 有限狀態機起始狀態符號

圖 4-3 轉換到 WaitCoins 狀態

圖 4-4 完成狀態

狀態機與順序工作流的本質差異

  • 順序工作流:活動按順序鏈執行,一個結束自動啟動下一個。事件參與度較低(如計時器)。
  • 狀態機:大量時間處於等待狀態,依賴事件驅動轉換。狀態本身不主動觸發事件,而是被動等待。同一狀態可因不同事件轉向不同目標狀態。

WF 中由 State 活動創建離散狀態,State 為組合活動但對子活動有限制。根活動為特殊的 StateMachineWorkflowActivity(特殊的 State 活動),初始化時接收參數。

創建狀態機工作流應用程式

  1. 啟動 Visual Studio 2008
  2. 「檔案」→「新增專案」
  3. 展開 Visual C# → Workflow 節點
  4. 選擇「狀態機工作流控制台應用程式」或「狀態機工作流程式庫」
  5. 輸入名稱與路徑
  6. 點擊「確定」,VS 建立含設計器的專案

選擇狀態機工作流模板

狀態機工作流設計器介面

理解工作流實例與宿主應用程式的通訊機制至關重要,第 8 章將介紹「調用外部方法」,第 10 章講解「事件活動」與狀態機的事件驅動模型。

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