雖然我們無法跟蹤微軟的所有新技術(shù),但是Windows工作流基類庫(WF)卻是一項我們無論如何都不能錯過的技術(shù)。本文將闡明WF的優(yōu)勢,并且建立我們的第一個基于WF的應用程序。WF是一套多功能的編程構(gòu)架,這套框架用于建立圖形化的商業(yè)規(guī)則控制流程序。 WF是四項技術(shù)之一,其它三項技術(shù)為WPF、WCF和Windows CardSpace。這些技術(shù)同.NET 3.0框架一起發(fā)布。也許這個”3.0”非常帶有迷惑性,有很多開發(fā)人員認為這些技術(shù)必須運行在新的.NET框架中,事實上,所有的技術(shù)都是運行在.NET2.0中的。這些軟件和框架的層次如圖1所示。 ![]() 圖1
現(xiàn)在面臨的問題是有很多.NET開發(fā)商一直不愿意使用新版本的.NET framework,原因是如果使用這些新的framework,就必須在客戶的機器上安裝它們。但事實上,.NET 3.0技術(shù)只是在.NET 2.0的基礎(chǔ)上加了一些庫而已。我們可以在VS2005中象使用其他的第三方.net庫一樣使用它們。
一、WF的優(yōu)勢 按著長規(guī),一種新的技術(shù)必須為他們的黃金時代做準備,以及在它們被廣泛使用之前提供切實可行的解決方案。這兩點WF都做到了。WF不僅采用了.NET3.0技術(shù),而且是根據(jù)實際需要的功能和設計經(jīng)驗而精心實現(xiàn)的。下面是關(guān)于WF的一些實際的優(yōu)勢:
1. WF提供了一套高度抽象和可視化的商業(yè)處理模型。這套模型可以非常容易地使用和被理解。無論使用它的是開發(fā)人員或是商業(yè)領(lǐng)域?qū)<摇?/font> 2. WF可以非常容易地改變與之相關(guān)的商業(yè)處理規(guī)則,并且不必重新編譯。
3. WF編程模型可以使開發(fā)人員建立一套可測試的內(nèi)核集合,并且可以在多個程序中使用它們。
如果和UML的活動圖進行比較的話,WF圖表擁有最好的軟件構(gòu)架,我們并不用擔心這套構(gòu)架過時,或是和商業(yè)處理邏輯有分歧,因為WF就是商業(yè)處理邏輯。 WF運行時為我們提供了一個強大的,可擴展的開發(fā)執(zhí)行環(huán)境。為了可以長時間處理,當工作流處理空閑狀態(tài)時,可以被保存在一個數(shù)據(jù)庫中。當一個動作發(fā)生時,工作流被激活。 二、面向動作編程(Activity-Oriented Programming,AOP) WF向.NET開發(fā)人員引入了一個而向動作編程的概念。這套編程模型可以通過組合動作集合來完成大規(guī)模的商業(yè)處理邏輯。下面我們來看看圖2所示的部分工作流,一個工作流圖包含了如validateProductActivity, sellProductActivity, backOrderProductActivity和shipOrderActivity等動作。在工作流中的每一個動作都擁有一個單獨的執(zhí)行單元。 ![]() 圖2 工作流圖:一個包含了動作的工作流圖,它們中的每一個都執(zhí)行一個商業(yè)處理邏輯。
我們可以使用WF設計器將動作加到一個圖表中,并且指定相應的條件以及基于一定規(guī)則的控制流指定工作流程。這種方法是非常強大的,它將使我們的應用程序非常容易編寫,理解和配置。
三、開始編寫WF程序
為了編寫WF程序,我們需要如下的開發(fā)環(huán)境:
1. .NET 2.0 Framework
2. Visual Studio 2005
3. .NET 3.0 Framework
4. Visual Studio 2005 工作流擴展
在.NET 3.0中的WF框架中定義了超過350個類,這些類分別在如下的三個命名空間中:
1. System.Workflow.Activities
2. System.Workflow.ComponentModel
3. System.Workflow.Runtime
當我們在VS2005中安裝WF擴展時,WF擴展將VS2005中加入一個工作流模板工程,我們可以選擇這個模板工程來建立或加一個新的WF項目。
在安裝完上術(shù)的軟件后,我們就準備建立第一個工作流。下面的部分將描述建立和編寫WF程序的一系列步驟。 四、順序工作流和狀態(tài)機工作流的對比 我們可以建立兩個類型的工作流:順序工作流和狀態(tài)機工作流。在圖2中顯示的是一個順序工作流,這個圖類似于UML的動作圖。這種工作流將按著預先定義的順序來執(zhí)行。 與之大不相同,狀態(tài)機工作流定義了一個狀態(tài)的集合,在些狀態(tài)之間可以互相轉(zhuǎn)換。工作流的外部事件將處理狀態(tài)之間的轉(zhuǎn)換。為了簡便起見,本文將只關(guān)注順序工作流。
最后,我們可以將任何順序工作流描述成一個狀態(tài)機工作流,反之亦然。然后,每一種工作流類型并不是對所有應用程序都適合,如在人機交互的情況下,狀態(tài)機工作流將是最好選擇。 五、建立一個工作流應用程序 在建立一個工作流之前,我們需要建立一個主應用程序,工作流將運行在這個程序中。為了完成這個工作,首先啟動Visual Studio 2005,單擊File菜單,選擇New > Project。在新建工程對話框中選擇相應的工程類型(如圖3的工作流類型)和開發(fā)語言。
圖5
接下來,將解決方案樹展開,會出現(xiàn)三個System.Workflow引用。這三個庫就是.NET3.0中所帶的Windows工作流組件庫。
為了更好地理解動作工作流應用程序,打開Program.cs文件(C#)或Module.vb文件(Visual Basic)。我們會看到如下的代碼。
代碼1(C#):
代碼2(Visual Basic):
要注意的是這兩個文件的最后兩行會在調(diào)用WaitHandle.WaitOne()之后執(zhí)行。這些代碼行顯示了一個控制臺消息,并且等待控制臺輸入。將這兩行加到我們的控制流應用程序中,并使我們的控制臺工作流程序始終處于運行狀態(tài)(直接輸入一個字符串,并按回車為止)。 六、編寫代碼動作程序
圖6 錯誤標記。表示還沒有輸入相應的動作代碼。
為了使這個代碼動作完整,并消除這個錯誤,雙擊圖中的動作來建立一個事件處理函數(shù)。然后加入如下的處理代碼。在本例子中,只是簡單地向控制臺寫入一個字符串:
// C#
現(xiàn)在我們已經(jīng)建立了一個工作流應用程序,并且擁有了一個動作,下面我們準備運行它。 七、運行我們的工作流程序
在運行程序之前,我們可以在main函數(shù)里設置斷點來觀察工作流本身的運行情況以及其他的細節(jié)部分。
在C#中打開Program.cs或在Visual Basic中打開Module.vb,并且在Main()方法中的表達式中設置一個斷點。
按F5來運行這個工作流程序,然后按F10一步一步地跟蹤Main()方法中的每一行程序。當我們按步驟跟蹤代碼時,要注意這些關(guān)鍵的動作在該方法中的執(zhí)行情況。下面是程序各部分運行的步驟: 1. 首先,WF運行時被實例化。這個會最先發(fā)生,這是因為WF使用運行時來實例化,、執(zhí)行以及管理我們的工作流。
2. 動作的處理方法當工作流的運行時的WorkflowCompleted 和 WorkflowTerminated事件發(fā)生時被注冊。這將允許當一個工作完成或中途退出時通知工作流應用程序。
3. 工作流被實例化。要注意的是應用程序并沒有直接實例化工作流,而是通過調(diào)用工作流運行時的CreateWorkflow()方法來實例化工作流的。
4. 最后,這個方法調(diào)用了工作流的Start()方法,這個方法開始執(zhí)行工作流的動作代碼。 |
|