Windows Workflow
學習文檔
工做流:爲了實現組織目標,有關業務活動依時序或邏輯關係相互鏈接構成業務流程。在業務開展過程當中,文檔、信息或任務,依據組織規範在參與者之間傳遞、處理或執行。業務流程中,實現了基於計算機自動化的所有或部分稱爲工做流。
工做流管理系統(WorkflowManagementSystem,WFMS):是定義、建立、執行工做流的系統。在最高層上,WFMS應能提供如下三個方面的功能支持:
? 建造功能:對工做流過程及其組成活動定義和建模;
? 運行控制功能:在運行環境中管理工做流過程,對工做流過程當中的活動進行調度;
? 運行交互功能:指在工做流運行中,WFMS與用戶(業務工做的參與者或控制者)及外部應用程序工具交互的功能。
工做流管理系統的基本結構
WFMS組成如圖所示:
![](http://static.javashuo.com/static/loading.gif)
在這個通常結構模型中,有三種類型的部件:
? WFMS內提供各類功能支持的軟件組元(用深色填充圖形表示);
? 爲一個或多個軟件組元使用的各類系統定義和控制數據(未填充圖形);
? 應用程序和數據庫(淺色填充圖形)。
系統中主要部件和數據的做用以下:
1.
過程定義工具
過程定義工具被用來建立計算機可處理的業務過程描述。它能夠是形式化的過程定義語言或對象關係模型,也能夠是簡單地規定用戶間信息傳輸的一組路由命令。
2.
過程定義
過程定義(數據)包含了全部使業務過程能被工做流執行子系統執行的必要信息。這些信息包括起始和終止條件、各個組成活動、活動調度規則、各業務的參與者須要作的工做、相關應用程序和數據的調用信息等。
3.
工做流執行子系統(WES)和工做流引擎
工 做流執行子系統也稱爲(業務)過程執行環境,包括一個或多個工做流引擎。工做流引擎是WFMS的核心軟件組元。它的功能包括:解釋過程定義;建立過程實例 並控制其執行;調度各項活動;爲用戶工做表添加工做項;經過應用程序接口(API)調用應用程序;提供監督和管理功能等。工做流執行子系統能夠包括多個工 做流引擎,不一樣工做流引擎經過協做共同執行工做流。
4.
工做流控制數據
指被WES和工做流引擎管理的系統數據,例如工做流實例的狀態信息、每一活動的狀態信息等。
5.
工做流相關數據
指與業務過程流相關的數據。WFMS使用這些數據肯定工做流實例的狀態轉移,例如過程調度決策數據、活動間的傳輸數據等。工做流相關數據既能夠被工做流引擎使用,也能夠被應用程序調用。
6.
工做表和工做表處理程序
工做表列出了與業務過程的參與者相關的一系列工做項,工做表處理程序則對用戶和工做表之間的交互進行管理。工做表處理程序完成的功能有:支持用戶在工做表中選取一個工做項,從新分配工做項,通報工做項的完成,在工做項被處理的過程當中調用相應的應用程序等。
7.
應用程序和應用數據
應用程序能夠直接被WFMS調用或經過應用程序代理被間接調用。經過應用程序調用,WFMS部分或徹底自動地完成一個活動,或者對業務參與者的工做提供支持。與工做流控制數據和相關數據不一樣,應用數據對應用程序來說是局部數據,對WFMS的其餘部件來講是不可見的。
2.1 .Net Framework 3.0 簡介
從 圖上咱們能夠看到3.0是以.Net Framework 2.0爲核心,分別對不一樣技術和應用層面提供的一些模塊。我記得一篇文章裏面說到.Net Framework 3.0 不該該叫3.0更確切的叫.Net Framework 2.5(哈哈!不知道你們是否贊同這個說法)。
在.Net Framework 3.0
包含了四個模塊:
WPF
(Windows Presentation Foundation
):
WPF is a productive, unified approach to UI, Media, and Documents that you can use to deliver unmatched user experiences to your customers.
WPF提供了一個統一UI、媒體和文檔的用戶體驗。
WPF統一了WinForm和Web的用戶體驗開發。
WCF
(Windows Communication Foundation
):
Unified framework for rapidly building service-oriented applications
WCF是一個迅速的創建SOA應用的框架。
WCF集成了WebService、Remotting和Com+的一些特徵。
WF
(Windows Workflow Foundation
):
The Programming Model, Engine And Tools For Building Workflow Enabled Applications On
WindowsPlatform.
在
Windows平臺上提供一個構建工做流程應用的模塊、引擎和工具。
CardSpace
(Windwos CardSpace
):
Technology that simplifies and improves the safety of online login and authentication.
CardSpace是一個提供統一安全管理和身份認證的技術
通 過上面簡單的介紹,發如今.Net Framework 3.0中一個關鍵的內容就是統一和集成,微軟但願是在.Net Framework 3.0開發時代不須要讓開發人員費盡腦筋考慮是選擇WinForm仍是Web,使用WebService仍是Remotting、Com+等等的技術難 題,只須要按照.Net Framework 3.0的技術架構開發,就能夠作到開發階段的部署透明化(呵呵!多麼美好的將來呀!!!)。
2.2 Windows Workflow Foundation簡介
Windows Workflow Foundation是幫助您在
Windows平臺上快速創建工做流應用程序的編程模型、引擎和工具,爲開發和執行各類基於工做流的應用程序提供了編程框架和工具。
Windows Workflow Foundation 對執行模型進行了活動自動控制方面的虛擬化。這使您能編寫能夠捕捉各類控制流模式的複合活動,範圍包括多種鏈接和合並、狀態機、圖形、序列、交叉存取和非本地退出等。總之,它將使您可以經過「高保真」的複合活動對存在於現實世界中的控制流模式進行建模。
Windows Workflow Foundation是一個幫助你開發基於
Windows平臺的工做流解決方案的可擴展的框架。做爲未來Microsoft WinFX的一部分,
Windows Workflow Foundation提供一組API和工具以支持基於工做流的應用程序的開發和執行。
Windows Workflow Foundation爲建立跨越不一樣應用程序的端到端解決方法提供了一個簡單、統一的模型。
Windows Workflow Foundation是一個通用的工做流框架。基於
Windows Workflow Foundation的解決方案由相互連接的.NET組件構成並運行在宿主程序中。就像你在一個特定的設計環境下建立ASP.NET頁面同樣,
Windows Workflow Foundatio也爲你提供了一個良好的設計環境,在可視化設計器中,你能夠建立特定的流程、在工做流組件中增長代碼、定義商業過程,
Windows Workflow Foundation提供了工做流引擎、.NET-managed API、運行時服務、與Visual Studio 2005集成的可視化編輯器和調試工具。你可使用
Windows Workflow Foundation建立和執行運行在客戶端和服務器端的工做流,而且能夠運行在全部的.NET應用程序中。
.Net Framework 3.0
開發環境
操做系統:
最低運行要求爲
Windows XP Service Pack 2 (SP2) 或
Windows Server 2003。
開發工具和安裝步驟,對僅作wwf,四、5能夠不裝:
1. .Net Framework 2.0(若是安裝VS2005能夠略過該步驟)
2. Visual studio 2005 (可使用 Express Edition)
3. .NET Framework 3.0(WinFX) runtime components。(dotnetfx3setup.exe)
4.
Windows SDK--1G左右 (6.0.6000.0.0.WindowsSDK_Vista_rtm.DVD.Rel.img)
5. vsextwfx.msi(是VS2005開發WPF、WCF的插件)
6. Visual Studio 2005 Extensions for
Windows Workflow Foundation (EN).exe (是一個WF可視開發環境)
工做流須要與主機環境同步 — 一般是
Windows Forms 應用程序或 ASP.NET 應用程序。事件組中的活動能使工做流中止以等待外部事件、處理接收的事件,或只是在執行下一步以前進行等待。最後,Web 服務和狀態組將目標鎖定在工做流的兩種特殊功能 — 將內部引擎爲公開爲 Web 服務或公開爲狀態機。
Sequential
(順序)模型
Sequential模型是流程按照事先預約的順序執行,其中有可能存在分支(IFELSE)、循環(WHILE)等流程。
State Machine
(狀態機)模型
State Machine模型是以事件(Event)爲驅動,使得流程自己轉換不一樣的狀態,每一個狀態有其轉變的範圍(即均可以轉變成那些狀態)和驅動事件。
咱們仍是以一個圖來介紹WF的一些關鍵概念和WF的組成部分。WF包括了Runtime Services(運行時服務)、Runtime Engine(運行時引擎)、Base Activity Library(基礎Activity庫)。基於此咱們要理解以下概念:
l Workflows are a set of Activities
Workflows是一個Activity的集合
l Workflows run within a Host Process: any application or server
Workflows須要寄宿在一個進程中,任何的應用或者服務均可以是Workflow的宿主
l Developers can build their own Custom Activity Libraries
開發人員能夠構建本身的Activity類庫
l Base Activity Library
Out-of-box activities and base for custom activities
基礎的Activity類庫,是自定義Activity的基類
l Runtime Engine
Workflow execution and state management
負責Workflow的執行和管理的引擎
l Runtime Services
Hosting flexibility and communication
負責Workflow寄宿和通信的服務
l Visual Designer
Graphical and code-based construction
一個圖形化的設計器
經過這些概念咱們瞭解到一個Workflow是由多個Activity組成,這些Activity能夠WF中預約義的基礎Activity也能夠是用戶自定義的Activity;Workflow須要有本身的Runtime,這個Runtime負責了Workflow的執行、管理和通信。
這裏有一個很是重要的概念就是Activity。全部的Workflow都是由Activity組成,那麼什麼是Activity呢?接下來我會向你們介紹。
咱們能夠從兩個方面理解Activity:
Activities are the building blocks of workflows
Activity是workflow一個已經編譯的模塊
l The unit of execution, re-use and composition
是一個可執行的、可重用和能夠組合的單元
l Basic activities are steps within a workflow
基礎的Activity是Workflow的一個步驟
l Composite activities contains other activities EG: Sequence
複雜的Activity能夠包含其餘的Activity,例如:Sequence(一個WF預約義的Activity)
l Partners and customers author custom activities EG: 「ApproveOrder」
Activity能夠是合做夥伴或者客戶提供的一個自定義的Activity,這個Activity可能完成一些特定的商業邏輯,例如:「ApproveOrder」
Activities are classes:
l Properties and events are defined by the activity author and programmable from workflows
能夠在Activity中定義屬性和事件由workflow使用
l Has methods that are coded by the activity author but invoked by the workflow runtime (EG: Execute) or designer
Activity中的方法是由Activity的做者實現(如:Execute),由workflow或則設計器進行調用
l Can be built into workflow assemblies or deployed as re-usable libraries
能夠編譯在workflow中或則做爲可重用庫依賴於workflow
下面代碼演示了一個
Activity
的例子:
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
{
public SendEmailActivity()
{
............
}
// override Execute with your custom logic
protected override ActivityExecutionStatus
Execute(ActivityExecutionContext context)
{
// you custom logic
return ActivityExecutionStatus.Closed;
}
//property
public string To
{
get{........;}
set{........;}
}
//event
public event EventHandler<CustomActivityEventArgs> Sending
{
add{........}
remove{........}
}
}
這裏面一直在重點強調Activity的是重用,能夠說一個Activity的最重要之處就是重用。重用不僅僅是代碼的重用,而是業務邏輯的重用,這也是工做流應用的靈活之處。在開發工做流應用的時候,怎樣劃分業務邏輯?業務邏輯的顆粒度有多細?WF並無規定,何況這個問題是仁者見仁,智者見智,並無一個統一的定論。
我的的理解在定義一個Activity時要作到第一可重用、第二鬆耦合。在本文中只是對WF的組成和工做原理進行簡單的介紹,不會深刻討論業務邏輯的劃分和定義,我想即便不使用WF,業務系統也會遇到一樣的問題。
在自定義Activity時還有幾個比較重要的概念,分別是Designer、ActivityValidator、CodeGenerator、Serializer、ToolboxItem和定義行爲的SupportsTransaction、SupportsExceptionHandlers。實際上這些該是Activity的Attribute類,分別制定了Activity在設計器中的UI界面、對Activity在設計期間的完整性校驗、Activity的序列化等操做。具體內容我會在後面章節具體介紹,這裏只介紹如何使用。
[Designer(typeof(CustomActivityDesinger),typeof(IDesigner))]
[ActivityValidator(typeof(SendEmailValidator))]
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
{
......
}
public class CustomActivityDesinger : ActivityDesigner
{
......
}
public class SendEmailValidator :
System.Workflow.ComponentModel.Compiler.ActivityValidator
{
......
}
1
:
Control Flow Activity
:控制流程類
l
Sequence Activity:順序流程,使您可以協調一組子活動的連續執行。該序列在最後一個子活動完成以後完成。
l
Parallel Activity
:並行流程,使您的工做流可以相互獨立地執行兩個或更多個操做。該活動在繼續執行以前會等待這些操做終止。
l
IfElse Activity
:條件判斷流程,使您的工做流可以有條件地執行多個可供選擇的分支之一。可在每一個分支上放置一個條件,而條件爲真的第一個分支將執行。無需在最後一個分支上放置條件,由於它被視爲「else」分支。
l
While Activity
:循環流程,使您的工做流可以在一個條件被知足時執行一個或多個活動。在每次迭代以前,都評估該條件。若是爲真,則全部子活動都會執行;不然,該活動完成。可指定聲明性條件或代碼條件。
l
ConditionedActivityGroup
:條件組,使您的工做流可以基於特定於每一個活動的準則有條件地執行一組子活動,直到針對 CAG 總體知足完成條件。子活動相互獨立並可能並行執行。
l
Replicator Activity
:自我複製。能夠在運行中自我複製實例。使您的工做流可以建立給定活動的任意多個實例,而且順序或同時執行它們。
l
Delay Activity
:延時執行,使您可以控制工做流的定時以及將延遲內置到工做流。您能夠在Delay 活動上提供超時,以便工做流在恢復執行以前暫停。
l
InvokeMethod
:使您的工做流可以調用接口上的方法,以便將消息從工做流發送到向WorkflowRuntime 註冊的數據交換服務。
l
Policy
:使您可以表示或執行規則集合。該活動不在工具箱中;要訪問它的功能,必須建立自定義活動並使用派生。
2
:
Workflow Lifetime Activity
:工做流相關
l
InvokeWorkflow Activity
:調用執行另外的工做流,使您的工做流可以調用或啓動另外一個工做流(可達到任意深度)。例如,被調用的工做流能夠調用第三個工做流,該工做流又能夠調用第四個工做流,等等。遞歸調用不受支持。受支持的調用模型是發後不理。
l
Suspend Activity
:暫停當前執行的工做流。掛起工做流的操做,以便可以在發生某個錯誤條件時進行干預。當工做流實例掛起時,將記錄錯誤。可指定一個消息字符串來幫助管理員診斷髮生了什麼事情。與當前實例關聯的全部狀態信息都被保存,而且這些信息會在管理員繼續執行時恢復。
l
Terminate Activity
:停止工做流。使您可以在發生任何異常狀況時當即結束工做流的操做。若是是在 Parallel 活動內部調用,則全部分支都被忽然終止,而不管它們的當前狀態如何。當工做流終止時,會記錄錯誤,並提供一個消息以幫助管理員弄清楚發生了什麼事情。
3
:
Event Waiting Activity
:事件類
l
EventSink
:在向 WorkflowRuntime 註冊的數據交換服務引起指定事件時,使工做流可以從該服務接收數據。
l
EventDriven Activity
:等待事件驅動。指定要等待處理的事件名,參數等。表明一系列其執行由事件觸發的活動。第一個子活動必須可以等待外部事件。可行的首要子活動是 EventSink 和Delay。在這種狀況下,Delay 用做超時。
l
Listen Activity
:偵聽消息。這個能夠同時偵聽不少消息。一個Listin裏面有多個EventDriven。使工做流可以等待(可能存在的)多個事件之一,或者在指定的超時間隔以後中止等待,而且基於結果分支。可向每一個分支中添加一個或多個由事件驅動的活動。只有第一個知足條件的分支被執行;其餘分支都不會運行。
4
:
Transaction and Exception Activity
:事務和異常處理類
l
Transaction Context Activity
:處理事務中的上下文,支持短時間、長期的事務。事務上下文是用於對活動進行分組的塊。該活動主要用於事務性執行、補償和異常處理,能夠根據狀況進行同步。經過同步事務性上下文,可確保對活動中共享數據的任何訪問都將正確地序列化。
l
Throw Activity
:拋出異常。使您可以引起指定類型的異常。使用該活動等效於在用戶代碼中引起異常的代碼處理程序。該活動是引起 .NET 異常的聲明性方式。
l
ExceptionHandler
:異常處理。使您可以處理指定類型的異常。ExceptionHandler 活動是其餘活動的包裝,在指定的異常發生時,這些活動實際執行所需的任何工做。可根據狀況指定一個用於存儲異常的本地變量,而且使其能夠在代碼隱藏中使用。
l
Compensate Activity
:補償處理,只能放在Exception中,處理一些回滾處理等。使您可以在發生錯誤時調用代碼來撤消或者補償已經由工做流執行的操做。一般,對於如今已被取消的操做,您可能但願向先前已經得到成功通知的用戶發送電子郵件。
5
:
Data-Centic Activity
:數據(交換)處理類:用於
WF
處理空間和
Host
空間之間的數據交換。
l
UpdateData Activity
:WF把數據更新到Host。使您的工做流可以經過在外部數據源對象上定義的方法更新數據存儲區。當 UpdateData 活動被觸發時,關聯的方法將在宿主線程內部執行。
l
SelectData Activity
:WF發向Host的請求,使您的工做流可以經過在外部數據源對象上定義的方法查詢外部數據。當觸發 SelectData 活動時,關聯的方法將在宿主線程內部執行。該方法返回的值被傳遞給工做流。
l
WaitForData Activity
:使您的工做流可以從外部數據源對象接收信息。當傳入的數據修改綁定數據源的狀態時,該活動被觸發。傳入的數據是經過綁定數據源服務接收的。
l
WaitForQuery Activity
:Host發向WF,WF返回DataSource。使外部應用程序可以在您的工做流中查詢數據。該活動將在從宿主收到查詢以前一直等待。來自外部應用程序的查詢使用綁定數據源服務上的方法提交給工做流。
6
:
WebService Activity
:
WeSerivice
的處理
l
InvokeWebService Activity:調用WebService
使您的工做流可以調用 Web 服務方法。您須要指定要使用的代理類(使用 WSDL),以及您想要調用的方法的名稱。同步和異步調用都受到支持。
l
WebServiceReceive Activity
:使做爲 Web 服務自己公開的工做流可以接收 Web 服務請求。
l
WebServiceResponse Activity
:使做爲 Web 服務自己公開的工做流可以響應 Web 服務請求。
7
:
The Code Activity
:代碼處理類
l
Code Activity
:可寫一些代碼,您可以向工做流中添加 Microsoft Visual Basic .NET 或 C# 代碼以執行自定義操做。可是,這些代碼不該該用對 Web 服務等外部資源的依賴性來阻塞工做流。可是我不以爲這樣的處理好,由於這樣的邏輯有點寫死進程序裏了。
8
:
State Workflow Activity
:狀態機工做流處理類
l
State
:表示狀態機工做流中的狀態。一個工做流必須有個初始狀態,有個結束狀態。
l
StateInitialization
:初始狀態。我好像沒用過這個。在 State 活動中,用做在狀態轉換時執行的子活動的容器。
l
SetState
:設置下一個狀態。使您的狀態機工做流可以指定向新狀態的轉換。
9
:
Custom Activity
:用戶自定義狀態。
Visual Studio 2005
中的工做流項目類型
l 順序工做流控制檯應用程序 (Sequential Workflow Console Application):建立用於生成工做流的項目,該工做流包含一個默認的順序工做流和一個控制檯測試宿主應用程序。
l 順序工做流庫 (Sequential Workflow Library):建立用於以庫的形式生成順序工做流的項目。
l 工做流活動庫 (Workflow Activity Library):建立一個用來建立活動的庫的項目,之後能夠將其做爲工做流應用程序中的構造塊重用。
l 狀態機控制檯應用程序 (State Machine Console Application):建立用於生成狀態機工做流和控制檯宿主應用程序的項目。
l 狀態機工做流庫 (State Machine Workflow Library):建立用於以庫的形式生成狀態機工做流的項目。
這個例子咱們完成一個最基礎的工做流,在控制檯上顯示一些此工做流自身的信息。
這個練習咱們學習工做流相關的基本操做。
新建項目,選擇「順序工做流控制檯應用程序」:
從工具箱中拖一個
到設計器:
填寫代碼:
選擇codeActivity1,點屬性頁,ExecuteCode屬性輸入方法名稱showInfo,雙擊方法名,Visual studio自動生成方法代碼框架,
填寫代碼:
public sealed partial class Workflow1: SequentialWorkflowActivity
{
……
private void showInfo(object sender, EventArgs e)
{
CodeActivity c = (CodeActivity)sender;
Console.WriteLine("Hello, from '{0}'./nI'm an instance of the {1} class.",
c.Name, c.ToString());
Console.ReadLine();
}
}
運行能夠看到:
這個例子咱們實現一個工做流,彈出消息框,顯示從主程序接收到的數據。
這個練習咱們學習如何經過參數傳遞數據到工做流。
讓 咱們繼續分析並修改該工做流,以使其在實例化之後接收和使用數據。有兩種在實例化工做流之後使其接收數據的常規方法:參數和事件。若是選擇使用參數,則需 要在可視化設計器中手動定義參數名稱和類型的列表。若是選擇使用事件,則須要建立並添加一個自定義活動(該活動充當在工做流模型中的某個位置介入的外部 源),而且傳入一些數據。首先咱們學習參數的使用,後面咱們將說明基於事件的方法。
首先爲
Workflow1
添加屬性
FirstName
和
LastName
:
public sealed partial class Workflow1: SequentialWorkflowActivity
{
……
private string _FirstName;
public string FirstName
{
get { return _FirstName; }
set { _FirstName = value; }
}
//{
// 數據能夠保存到UserData中,以下:
// get { return (string)UserData["FirstName"];}
// set { UserData["FirstName"] = value; }
//}
private string _LastName;
public string LastName
{
get { return _LastName; }
set { _LastName = value; }
}
……
}
在解決方案中新建一個
windows
應用程序
WinFormHost
,設計主窗體以下:
添加引用:
生成
tbStartWorkflow_Click
事件並填寫代碼(代碼能夠從
WorkflowConsoleApplication
的
program.cs
中複製獲得
):
using System.
Windows.Forms;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace WinFormHost
{
public partial class Form1 : Form
{
……
private void tbStartWorkflow_Click(object sender, EventArgs e)
{
using<