什么是工作流?
工作流(Workflow),是對工作流程及其各操作步驟之間業務規則的抽象、概括、描述。
BPM:是Business Process Management的英文字母縮寫.即業務流程管理,是一套達成企業各種業務環節整合的全面管理模式。
工作流軟件,顧名思義,就是業務信息數據在多個環節模塊之間的流轉。
企業內部業務種類非常多、變化也非常多。雖然業務變化非常多,但是流程的控制基本是不變的。我們常說的工作流或者是“流程”就是指 控制流程流轉的核心引擎。
市面常見的工作流開發框架如下所示。

Windows Workflow Foundation
Windows Workflow Foundation(以下簡稱WWF)提供了一個編程框架和工具以開發和執行各種不同的基於工作流的應用程序,比如文檔管理、線型的商業應用、貿易單據流程、IT管理、B2B應用以及消費者應用。
WF(Windows Workflow Foundation)是微軟的工作流基礎組件。它是DotNet Framework中提供基於模型或者是聲明方式的流程執行引擎。
WF由DotNet Framework3.0一起發布。而且已經被應用與微軟的Sharepoint技術中。

WF包括3個核心組件:
- 活動框架
- 工作流活動運行時環境
- 工作流設計器
第一個工作流項目
1、打開VS新建一個解決方案,在解決方案中新建項目——WorkFlow——工作流控制台應用程序,命名為WorkflowConsoleApp

2、視圖——工具箱,添加WriteLine基元
WriteLine Activity:用於輸出一段字符串。

再添加一個WriteLine基元

會自動將這兩個基元包裝在一個Sequence序列容器里面,然后執行順序從上至下。當然也我們可以先添加一個Sequence序列容器,然后再往這個容器里面添加基元。
順序工作流
- 順序工作流就是將順序工作流容器中的所有動作按照順序往下執行。
順序容器Sequence:是在System.Activities.dll中定義的類型,繼承 NativeActivity是一個 sealed類。
1.[Activities]集合,可以存放Activity
2.[Activities]集合中的Activity按順序從上向下執行
3.[Variables]集合用於存放變量
3、我們來看Program.cs中的代碼如下:
Activity workflow1 = new Workflow1(); WorkflowInvoker.Invoke(workflow1);
這里就是工作流的啟動方式。WorkflowInvoker 包含同步調用工作流的實例方法和靜態方法。
為了更好的查看運行效果,添加如下代碼:
Console.ReadLine();
4、按F5運行

WF入門之活動
Activity在WF中是一個最基本的概念,當談及Activity時,通常是指如下兩個概念:
- Activty Class 。
- 在工作流中任意Activity派生類的統稱。
活動也就是流程中的步驟如果下圖


流程圖工作流
流程圖工作流:就是將工作節點按照流程圖規定的順序進行流動的工作流。
流程圖工作流跟順序工作流的區別:順序工作流只能從上往下執行,而流程圖工作流可以按照流程圖規定的順序進行流程的流轉。
這里,我們新建一個財務審批流程。
1、 新建活動
右鍵單擊項目WorkflowConsoleApp,添加“新建項”,選擇活動,命名為MoneyApproveActivity.xaml

2、 添加流程

修改名稱為”財務審批流程”。

3、 添加兩個WriteLine基元

4、 添加代碼活動
CodeActivity 代碼活動
- WF4.0 提供了許多Activity,但有時這些Activtiy並不能完成具體功能,如向數據庫添加數據,發送電子郵件等.在實現這些具體功能時,我們仍要使用某種編程語言,如C#.當我們需要這種功能時,可以使用 CodeActivity。
- 它是一個抽向類,繼承該類后,需要override該類的Execute方法,用於編寫自定義的功能代碼
右鍵單擊項目WorkflowConsoleApp,添加“新建項”,選擇“代碼活動”,然后命名為InputMoneyCodeActivity.cs

這個時候,我們看見默認的代碼如下:
public sealed class InputMoneyCodeActivity : CodeActivity { // 定義一個字符串類型的活動輸入參數 public InArgument<string> Text { get; set; } // 如果活動返回值,則從 CodeActivity<TResult> // 派生並從 Execute 方法返回該值。 protected override void Execute(CodeActivityContext context) { // 獲取 Text 輸入參數的運行時值 string text = context.GetValue(this.Text); } }
這里,我需要修改一下代碼,因為我要的並不是輸入參數,而是要輸出一個金額給到當前這個流程,然后再根據這個金額的大小來判斷流程的走向。
工作流中的數據的傳遞
- Variable變量:跟C#一樣可以再整個工作流或者是其中的一個Activity中添加一個變量。可以通過可視化的控制:變量的類型、作用域、默認值等 。
- Assign 賦值。可以對流程內定義的參數,變量賦值。
- Arguments 參數:Activity中傳入的參數或者是傳出的參數。
In參數:System.Activities.InArgument<T>傳入參數,可以在流程啟動的時候傳入參數的值。只能用於數據傳入流程節點內部。
Out參數:System.Activities.OutArgument<T>。用於將流程節點內部的數據傳遞到外部的變量或者其他流程的傳入參數。
In/Out參數:System.Activities.InOutArgument<T>。即用於傳入也用於傳出。
5、 修改代碼如下:
public sealed class InputMoneyCodeActivity : CodeActivity { // 定義一個字符串類型的活動輸入參數 //public InArgument<string> Text { get; set; } //定義一個Int類型的輸出參數 public OutArgument<int> Money { get; set; } // 如果活動返回值,則從 CodeActivity<TResult> // 派生並從 Execute 方法返回該值。 protected override void Execute(CodeActivityContext context) { // 獲取 Text 輸入參數的運行時值 //string text = context.GetValue(this.Text); int money; var v = Console.ReadLine(); int.TryParse(v,out money); context.SetValue(Money, money); } }
6、 生成項目WorkflowConsoleApp
7、 回到MoneyApproveActivity.xaml頁面
會發現工具箱中多了一個組件InputMoneyCodeActivity,將其拖放到MoneyApproveActivity.xaml界面中。

8、 重命名,雙擊InputMoneyCodeActivity組件,修改名稱為“獲取輸入金額”。

9、添加變量,用於接收InputMoneyCodeActivity代碼活動中的輸出參數的值,這樣在整個流程中才能夠訪問到這個接收的金額。

右鍵單擊活動代碼“獲取輸入金額”,選擇“屬性”,將Money的值賦值給全局變量GetMoney。

10、 添加WriteLine基元,流轉到“經理審批”

11、添加條件分支

添加條件,讓500作為一個判斷條件,分為大於500為True和小於等於500為False。

12、添加兩個WriteLine基元,當條件為True和False各執行一個基元。

13、 將MoneyApproveActivity活動設為啟動項。
修改Program代碼如下:
//Activity workflow1 = new Workflow1(); Activity workflow1 = new MoneyApproveActivity(); WorkflowInvoker.Invoke(workflow1); Console.ReadLine();
14、運行結果如下:

源碼下載地址:WorkflowConsoleApp.zip
