學習完本章,你將掌握:
1.了解工作流的概念和理論
2.把WF和BizTalk與WCF做比較
3.開始使用WF進行編程
4.知道怎樣使用Visual Studio工作流支持。以下是一小段進行郵政編碼驗證的代碼
string USCode = @"^(\d{5}$)|(\d{5}$\-\d{4}$)";
string CanadianCode = @"[ABCEGHJKLMNPRSTVXY]\D[A-Z]\d[A-Z]\d";
public static bool ValidatePostalCode(string str)
{
return (Regex.IsMatch(str,USCode)||Regex.IsMatch(str,CanadianCode));
}
這沒有什麼特別的:“測試一個輸入的字符串,如果為美國ZIP編碼或者加拿大郵政編碼則返回True,否則返回False”。這是一段很實用的代碼,事實上假如你不想在ASP.NET中使用其它驗證控件的話,你就可在你的ASP.NET中使用這段驗證邏輯。我們現在就創建一個Workflow應用程序,它將進行同樣的驗證,並且返回驗證是否通過的信息。
創建一個基於控制台的Workflow項目
1.啟動Visual Studio 2008
2.創建順序工作流控制台應用程序項目
3.項目名稱中輸入PCodeFlow
4.點擊確定,將自動生成下面的初始界面
在編輯代碼或插入Workflow項前,停留片刻看看Workflow項目為你生成的兩個文件:
Program.cs:從許多方面可以看出,這是一個典型的控制台應用程序源文件。然而,這個模板增加了大量代碼來支持Workflow的操作。理解這些代碼是本書的一個主要目標,但本章只是簡單了解一下它做了些什麼。
Workflow1.cs:這是一個Workflow組件,我們將對其進行修改以進行郵政編碼的驗證,第一次使用你就可以放入許多東西,但我們現在還是從使用這個簡單的Workflow開始工作吧。
創建一個工作流
在工具箱中拖一個IfElse活動組件到workflow設計界面上。
我們現在將使用IfElse活動組件來問下面的問題:“我們已有的一個字符串是一個合法的郵政編碼嗎?”。我們在代碼中將確實使用先前你看到的代碼段中的正則表達式來問這一問題。
但在我們進行這一步前請仔細看看workflow的視圖設計器。workflow視圖設計器提醒我們沒有提供相應的代碼來做這一決定。假如你看看命名為“ifElseBranchActivity1”的左邊分支的右上角,你將看到裡面有一個驚歎號標記的小圓形圖標。這是workflow視圖設計器在告訴你workflow並不完整。假如你試圖編譯帶有這種提醒圖標的項目時,將會編譯報錯。如你把鼠標移到圖標上並單擊呈現出的向下箭頭時,你還能看到更多關於這一錯誤情況的信息。
在IfElse活動的分支上添加代碼
1.移動鼠標到命名為“ifElseBranchActivity1”的左邊分支上,單擊以在屬性面板上激活這一分支的屬性。
2.我們添加一個條件,意思是說workflow執行到分支時將強制其執行一些動作(條件判斷為True時,將執行左邊分支)。為做到這些,單擊“condition”屬性激活條件類型屬性的下拉列表。從列表中你可以選擇“代碼條件”類型、“(無)”類型和“聲明性規則條件”類型。這裡選擇“代碼條件”類型。
3.上述步驟完成後,“condition”類型屬性用戶界面會包含一個“+”號,我們單擊展開它的子屬性,該子屬性也命名為“condition”,單擊以激活它。
4.“condition”屬性需要輸入我們想添加的內部事件名字。當條件需要判斷時這個事件將激發。在本例子中我們輸入“EvaluatePostalCode”。
Visual studio 2008在幕後為你在workflow源文件中添加了你在“condition”屬性中所指明的事件。稍候我們將添加在事件激發時所要執行的正則表達式代碼段。
在我們做這些工作之前,讓我們繼續在workflow視圖設計器上工作,我們剛剛增加了一個條件,它將引發工作流選擇左邊路徑還是右邊路徑。但是兩條路徑中都沒有指明工作流將進行的動作。我們在左邊“ifElseBranchActivity1”分支和右邊“ifElseBranchActivity2”分支中添加活動。
添加Code活動
1.拖一個“Code”活動到workflow視圖設計器上,並放到左邊分支(ifElseBranchActivity1)的區域內。
2.就像先前添加條件判斷的代碼一樣,我們將為該分支添加被選中時執行的代碼。單擊“codeActivity1”圖標以在屬性面板中激活它的屬性。
3.在“ExecuteCode”屬性中輸入“PostalCodeValid”。
Visual Studio 2008會自動插入該事件。稍候我們會提供對應的執行代碼。右邊分支也同樣做,只是要在“ExecuteCode”屬性中輸入“PostalCodeInValid”。
在我們的workflow中添加事件處理代碼
1.打開Workflow.cs准備進行編輯
2.添加引用:using System.Text.RegularExpression;
3.定位到“EvaluatePostalCode”方法上,插入下面的代碼:
private void EvaluatePostalCode(object sender, ConditionalEventArgs e) { string USCode = @"^(\d{5}$)|(\d{5}$\-\d{4}$)"; string CanadianCode = @"[ABCEGHJKLMNPRSTVXY]\D[A-Z]\d[A-Z]\d"; | e.Result = (Regex.IsMatch(_code, USCode) || Regex.IsMatch(_code, CanadianCode)); }
變量e是“ConditionalEventArgs”類型的實例,它用來告知“IfElse”活動應選擇哪條路徑。
4.我們也需要為workflow活動添加一種能力,以便接受輸入的字符串來進行驗證工作。為此我們添加下面的代碼,我們將聲明一個名為“PostalCode”的公有屬性。
private string _code=string.Empty;
public string PostalCode
{
get
{
return _code;
}
set
{
_code = value;
}
}
有了這些,我們的workflow應用程序就可以進行編譯了,但程序並不完整,我們還要在Workflow1.cs文件中定位到“PostalCodeValid”方法並插入下面的代碼:
Console.Write("The postal code {0} is valid.", _code);
同樣在“PostalCodeInValid”方法中插入下面的代碼:
Console.Write("The postal code {0} is *invalid*.", _code);
調用工作流
1.打開Program.cs文件。
2.定位到:
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);
3.把上述代碼替換為:
Dictionary<string,object>wfArgs=newDictionary<string,object>();
wfArgs.Add("PostalCode",args.Length>0?args[0]:""); WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);
編譯應用程序
執行你的工作流應用程序
1.打開命令提示符窗口。
2.在命令提示符下定位到編譯後所生成的應用程序目錄。
3.輸入pcodeflow 12345查看執行結果。
4.輸入pcodeflow 1234x再看看執行結果。
本文配套源碼