小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Windows工作流基類庫(kù)(WF)探密

 wyxhd2008 2013-04-26
雖然我們無法跟蹤微軟的所有新技術(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、WCFWindows 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, backOrderProductActivityshipOrderActivity等動(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ā)語言。



 新建工程模板。通過VS2005的工作流擴(kuò)展建立指定的基于工作流的應(yīng)用程序庫(kù)。


   
在這個(gè)模板頁中,選擇序列工作流控制臺(tái)應(yīng)用程序來建立一個(gè)基于控制臺(tái)的工作流應(yīng)用。將工程命名為SequentialWorkflowConsole。在工程被建立后,我們將看到一個(gè)新的,空的序列工作流程序,如圖4所示。


新的工作流。當(dāng)我們建立一個(gè)新的工作流應(yīng)用程序時(shí),當(dāng)將包括一個(gè)序列工作流圖。

   
下面到Visual Studio的工具面板,找到Windows工作流頁,這個(gè)控件頁中包含了一些預(yù)定義的動(dòng)作圖(如圖5所示)。我們可以將它們拖到剛才建立的工作流圖中。



 圖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#):
static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof( SequentialWorkflowConsole.ProcessOrderWorkflow)); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); } }


 

代碼2(Visual Basic):

 

Shared WaitHandle As New AutoResetEvent(False) Shared Sub Main() Using workflowRuntime As New WorkflowRuntime() AddHandler workflowRuntime.WorkflowCompleted, AddressOf OnWorkflowCompleted AddHandler workflowRuntime.WorkflowTerminated, AddressOf OnWorkflowTerminated Dim workflowInstance As WorkflowInstance workflowRuntime.CreateWorkflow(GetType(Workflow1)) workflowInstance.Start() WaitHandle.WaitOne() Console.WriteLine("Press any key to continue...") Console.ReadLine() End Using End Sub

要注意的是這兩個(gè)文件的最后兩行會(huì)在調(diào)用WaitHandle.WaitOne()之后執(zhí)行。這些代碼行顯示了一個(gè)控制臺(tái)消息,并且等待控制臺(tái)輸入。將這兩行加到我們的控制流應(yīng)用程序中,并使我們的控制臺(tái)工作流程序始終處于運(yùn)行狀態(tài)(直接輸入一個(gè)字符串,并按回車為止)。

 
 
六、編寫代碼動(dòng)作程序


   
得到一個(gè)簡(jiǎn)單的工作流,并運(yùn)行它的最容易的方法就是使用代碼動(dòng)作。下面將演示如何使用一個(gè)單獨(dú)的代碼動(dòng)作來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的工作流,并演示了如何使用工作流設(shè)計(jì)器和工作流工具箱。
   
下面再在解決方案瀏覽器上,雙擊WorkFlow1圖表來演示設(shè)計(jì)器。從Visual Studio工具箱中,拖動(dòng)代碼動(dòng)作,并將它們放到序列工作流圖上,如圖6所示。我們將看到一個(gè)紅色的感嘆號(hào)錯(cuò)誤標(biāo)記(在代碼動(dòng)作的右上角)。如果我們單擊這個(gè)標(biāo)記,就會(huì)顯示錯(cuò)誤信息:“Property "ExecuteCode" is not set.意思是說,我們還沒有輸入用于執(zhí)行的代碼動(dòng)作。這是Windows工作流的一個(gè)非常重要的特性,用來提示開發(fā)人員應(yīng)該按著步驟來輸入相應(yīng)的代碼,來對(duì)動(dòng)作進(jìn)行完善(一般是設(shè)置一個(gè)屬性,或是建立一個(gè)事件處理方法)。



圖6 錯(cuò)誤標(biāo)記。表示還沒有輸入相應(yīng)的動(dòng)作代碼。
 
為了使這個(gè)代碼動(dòng)作完整,并消除這個(gè)錯(cuò)誤,雙擊圖中的動(dòng)作來建立一個(gè)事件處理函數(shù)。然后加入如下的處理代碼。在本例子中,只是簡(jiǎn)單地向控制臺(tái)寫入一個(gè)字符串:
   // C#
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("Hello WF World!"); }


' Visual Basic Private Sub codeActivity1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs) Console.WriteLine("Hello WF World!") End Sub

現(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)作代碼。
    當(dāng)工作流完成時(shí),我們將會(huì)看到如圖7所示的一個(gè)控制臺(tái)窗口,在其中顯示“Hello WF World!”。按任意鍵后,這個(gè)控制臺(tái)窗口將關(guān)閉,然后按F5將退出這個(gè)工作流應(yīng)用程序。

工作流應(yīng)用程序執(zhí)行后的界面。在這個(gè)界面中顯示了動(dòng)作代碼執(zhí)行后的輸出信息“Hello WF World

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多