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