国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Windows 工作流活動(dòng)技術(shù)概覽

2019-11-17 04:43:30
字體:
供稿:網(wǎng)友

  大部分企業(yè)應(yīng)用程序都包含開發(fā)人員和架構(gòu)師認(rèn)為可以通過工作流輕松自然表示的業(yè)務(wù)流程。從根本上講,工作流是捕捉現(xiàn)實(shí)世界中實(shí)體間的交互的程序。工作流等待來自外部世界的促進(jìn)因素,而促進(jìn)因素卻可能需要相當(dāng)長(zhǎng)的時(shí)間才能到來。

  作為即將推出的 Microsoft .NET Framework 3.0 的重要組成部分,Windows Workflow Foundation 提供了編程模型和運(yùn)行時(shí)引擎,以便基于安裝了 .NET Framework 2.0 或更高版本的 Window 平臺(tái)來構(gòu)建支持工作流的應(yīng)用程序,其最低運(yùn)行要求為 Windows xp Service Pack 2 (SP2) 或 Windows Server 2003。

  從軟件的角度看,需要人為操作的多數(shù)是異步事件處理、狀態(tài)保持以及共享服務(wù)器可用性。Windows Workflow Foundation 實(shí)際上支持任何涉及人為操作的情況。

  每一個(gè)工作流都是一個(gè)聲明程序,其中,每條程序語句都用稱為活動(dòng)的組件表示。關(guān)于 Windows Workflow Foundation 的最大誤區(qū)之一在于將所有要素活動(dòng)都看成是順序相連或按狀態(tài)機(jī)轉(zhuǎn)換相連。實(shí)際上,Windows Workflow Foundation 對(duì)執(zhí)行模型進(jìn)行了活動(dòng)自動(dòng)控制方面的虛擬化。這使您能編寫可以捕捉各種控制流模式的復(fù)合活動(dòng),范圍包括多種連接和合并、狀態(tài)機(jī)、圖形、序列、交叉存取和非本地退出等。總之,它將使您能夠通過“高保真”的復(fù)合活動(dòng)對(duì)存在于現(xiàn)實(shí)世界中的控制流模式進(jìn)行建模。然而,Windows Workflow Foundation 提供了針對(duì)以下兩種模式的內(nèi)置活動(dòng):順序工作流和狀態(tài)機(jī)工作流。

  順序工作流有明確的開始和結(jié)束點(diǎn),從始至終,一步接一步,沿著一條可能的線路執(zhí)行。狀態(tài)機(jī)工作流可以被表示為一組狀態(tài),每種狀態(tài)可能包括各種活動(dòng),并由事件觸發(fā)。您可以定義初始和完成狀態(tài),并按照所有定義的轉(zhuǎn)換過程逐個(gè)狀態(tài)地執(zhí)行,直至到達(dá)結(jié)束狀態(tài)。

  正如我所談到的,工作流的構(gòu)造塊就是活動(dòng)。構(gòu)造這樣一個(gè)工作流意味著將活動(dòng)進(jìn)行組合以創(chuàng)建所需的模型來解決碰到的問題。雖然 Windows Workflow Foundation 提供了很多內(nèi)置的活動(dòng),但依然可以通過自定義活動(dòng)對(duì)其進(jìn)行完全擴(kuò)展。了解“開箱即用”活動(dòng)的目標(biāo)和功能對(duì)于充分理解該平臺(tái)的真實(shí)潛能十分要害。本期專欄將帶您瀏覽安裝 Windows Workflow Foundation Runtime 和 Visual Studio 2005 Designer 時(shí)涉及的標(biāo)準(zhǔn)工作流活動(dòng)。

  “開箱即用”活動(dòng)

  Windows Workflow Foundation 是 .NET Framework 3.0 (原先稱為 WinFX?)的組成部分。雖然它只是一個(gè)測(cè)試版本,但我發(fā)現(xiàn)最新的 Community Technology PReview(社區(qū)技術(shù)預(yù)覽,CTP)版非常穩(wěn)定,許多公司正廣泛使用該版本開發(fā)應(yīng)用程序。因此,已經(jīng)出現(xiàn)大量工具和自定義活動(dòng),一個(gè)基于新聞組和論壇(如 wf.netfx3.com)的有效的技術(shù)支持社區(qū)正日益發(fā)展壯大。假如您對(duì)工作流應(yīng)用程序感愛好,那么越早熟悉它越好。

  若要查找最新的下載,請(qǐng)?jiān)L問 Windows Workflow Foundation。安裝完畢后,啟動(dòng) Visual Studio 2005,打開一個(gè) Visual Basic? 或 C# 工作流項(xiàng)目,查看工具箱中的內(nèi)容。根據(jù)您所選擇的項(xiàng)目類型,工具箱可能如圖 1 中所示的一種。

  工具箱中的內(nèi)容與您的選擇操作相關(guān),根據(jù)您所選擇的工作流的類型會(huì)有不同。非凡是,圖 1 左邊的工具箱還包含您創(chuàng)建狀態(tài)機(jī)工作流時(shí)所需的狀態(tài)活動(dòng)。右邊的工作箱窗口只包含順序工作流的活動(dòng)。這組預(yù)定義的活動(dòng)可根據(jù)目標(biāo)和預(yù)期的行為分為幾類。圖 2 顯示了可能的分類:控制流、執(zhí)行、事件、Web 服務(wù)和狀態(tài)機(jī)。

Windows 工作流活動(dòng)技術(shù)概覽(圖一)
圖1 工具箱里的工作流活動(dòng)(Click the image for a smaller view)
Windows 工作流活動(dòng)技術(shù)概覽(圖二)
圖2

  控制流活動(dòng)治理圖形活動(dòng)執(zhí)行的順序。列表列出了實(shí)現(xiàn)循環(huán)的條件塊以及構(gòu)造。執(zhí)行活動(dòng)包括多種構(gòu)造,這些構(gòu)造可終止或掛起工作流、引發(fā)異常、執(zhí)行內(nèi)部或外部代碼,或者生成另一個(gè)工作流。多數(shù)工作流需要與主機(jī)環(huán)境同步 — 通常是 Windows Forms 應(yīng)用程序或 asp.net 應(yīng)用程序。事件組中的活動(dòng)能使工作流停止以等待外部事件、處理接收的事件,或只是在執(zhí)行下一步之前進(jìn)行等待。最后,Web 服務(wù)和狀態(tài)組將目標(biāo)鎖定在工作流的兩種非凡功能 — 將內(nèi)部引擎為公開為 Web 服務(wù)或公開為狀態(tài)機(jī)。讓我們檢查一下框架中的主要活動(dòng),然后分組進(jìn)行。通過條件控制工作流

  假如在工作流中指定了條件,運(yùn)行時(shí)引擎將對(duì)條件進(jìn)行計(jì)算,然后根據(jù)計(jì)算結(jié)果進(jìn)行操作。兩種基于條件的核心活動(dòng)是 IfElse 和 Policy。IfElse 活動(dòng)的執(zhí)行方式如同高級(jí)編程語言中的一條典型的 If 語句。它可以包含任意多基于條件的分支,以及一個(gè)在其他條件不滿足情況下執(zhí)行的默認(rèn)分支。而 Policy 活動(dòng)表示一系列規(guī)則。在 Windows Workflow Foundation 中,一條規(guī)則包括一個(gè)條件以及一個(gè)或一個(gè)以上引發(fā)的操作。可以將規(guī)則看作 If-Then-Else 語句,其中條件對(duì)應(yīng) If 塊的 Boolean 臨界條件,操作定義了 Then 和 Else 子句。讓我們進(jìn)一步了解各個(gè)活動(dòng),然后對(duì)它們進(jìn)行比較。

  當(dāng)被添加到一個(gè)工作流中時(shí),IfElse 活動(dòng)看起如圖 3 所示。默認(rèn)情況下,它有兩個(gè)分支,可以通過右鍵單擊并從上下文菜單中進(jìn)行選擇來添加新的分支。當(dāng)運(yùn)行時(shí)引擎達(dá)到一個(gè) IfElse 活動(dòng),它開始計(jì)算從左至右進(jìn)行的各分支的條件。各分支的條件被確定,第一個(gè)計(jì)算結(jié)果為“true”的分支被運(yùn)行。您可以通過活動(dòng)的上下文菜單中的命令往返移動(dòng)分支以更改分支的計(jì)算順序。要啟用分支,需要指定有效的條件。您可以采用以下兩種方法中的一種來指定條件:通過表達(dá)式或通過一段代碼。


Windows 工作流活動(dòng)技術(shù)概覽(圖三)
圖 3 IfElse 的實(shí)際活動(dòng)(Click the image for a larger view)

  假如您選擇使用表達(dá)式來指定條件,則要在設(shè)計(jì)器設(shè)置分支,并為 Visual Studio 2005 的“屬性”框中的“條件”項(xiàng)提供一個(gè)公共存放位置。接下來,打開表達(dá)式編輯器,輸入一個(gè)涉及工作流成員并且其計(jì)算值為布爾值的表達(dá)式。例如,假如工作流類具有名為 MinimumLength 的公共屬性,您可以將條件設(shè)置如下:

this.MinimumLength >= 8
  圖 4 所示的編輯器完全支持 IntelliSense? 并提供對(duì)工作流私有成員和公共成員的訪問。這意味著您也可以調(diào)用 Boolean 函數(shù)。假設(shè)您有一個(gè)屬性聲明如下:

Public Property MinimumLength() As Integer
 Get
  Return _minLength
 End Get
 Set(ByVal value As Integer)
  _minLength = value
 End Set
End Property
Windows 工作流活動(dòng)技術(shù)概覽(圖四)
圖 4 針對(duì) IfElse 活動(dòng)的 Condition Editor(Click the image for a larger view)

  當(dāng)您試圖讀取 MinimumLength 的值時(shí),運(yùn)行時(shí)會(huì)結(jié)束調(diào)用屬性的 get 存取器。該存取器能夠回復(fù)私有成員 _minLength 的值。IfElse 活動(dòng)中的最后分支可以沒有條件。在這種情況下,它將作為 IF 工作流語句的 Else 分支。

  指定條件的第二種方法是通過臨時(shí)代碼。在這種情況下,您可以為工作流類添加方法,例如:

Sub EvalCondition(ByVal sender As Object, ByVal e As ConditionalEventArgs)
 e.Result = ... ' Boolean value
End Sub
  該函數(shù)必須與接受對(duì)象和 ConditionalEventArgs 類并回復(fù) void 的簽名相匹配。ConditionalEventArgs 類的 Result 成員將設(shè)置為布爾值,代表?xiàng)l件的計(jì)算結(jié)果。

  IfElse 活動(dòng)可以進(jìn)行嵌套以表示復(fù)雜的邏輯,但邏輯的設(shè)計(jì)仍然要在工作流中進(jìn)行硬編碼。這種方法既有利也有弊。有利的一面在于它使您可以根據(jù)您的需求準(zhǔn)確設(shè)計(jì)工作流并將其與其他活動(dòng)整合。當(dāng)您需要?jiǎng)?chuàng)建一組規(guī)則來初始化部分工作流狀態(tài)時(shí),其不利的一面就顯現(xiàn)出來。讓一連串 IfElse 活動(dòng)僅僅為工作流的內(nèi)部成員分配值顯然有些矯枉過正。

  當(dāng)您真正需要控制工作流的流動(dòng)并連接各種工作塊時(shí),您應(yīng)該使用 IfElse 活動(dòng)組合。假如您所需要的僅僅是一個(gè)編程 If 語句序列,帶有附加到分支的簡(jiǎn)單代碼,那么最好使用 Policy 活動(dòng)。Policy 活動(dòng)是一個(gè)規(guī)則集合。與各規(guī)則相關(guān)的代碼僅限于設(shè)置工作流屬性,調(diào)用工作流方法或針對(duì)引用的程序集中的類型的靜態(tài)方法。

  活動(dòng)與已排序的規(guī)則集合相關(guān)聯(lián),您可以通過編輯器定義規(guī)則。每條規(guī)則都有優(yōu)先級(jí)和 Active 屬性。這兩種屬性的組合確定了是否應(yīng)當(dāng)評(píng)估規(guī)則,以及采用哪種優(yōu)先級(jí)。另外,規(guī)則還必須指定重估行為 —“Always(始終)”(默認(rèn)值)或“Never(從不)”。假如設(shè)置為“Always”,規(guī)則將根據(jù)需要進(jìn)行重估,否則只進(jìn)行首次評(píng)估,以后無論工作流狀態(tài)如何變化,也不再更改。

  然而,作為一個(gè)整體設(shè)置的規(guī)則要進(jìn)行正向推理。簡(jiǎn)而言之,正向推理是指一個(gè)規(guī)則的操作導(dǎo)致其他相關(guān)規(guī)則被重估的能力。例如,對(duì)另一個(gè)規(guī)則測(cè)試的字段的值進(jìn)行更新操作需要對(duì)所涉及的規(guī)則進(jìn)行重估(除非對(duì)該規(guī)則的重估被禁用)。正向推理有三種類型。 隱式推理表示運(yùn)行時(shí)引擎將判定哪些字段被一些操作修改了,然后自動(dòng)對(duì)它們進(jìn)行重估。只要操作顯式地作用于屬性,這種機(jī)制即可成功。假如有如下操作,情況又會(huì)怎樣:

IF this.MinimumLength <= 8 THEN RefreshInternalState()
  有誰能夠知道 RefreshInternalState 方法將要做什么?該方法可能會(huì)觸及涉及策略活動(dòng)中其他規(guī)則的工作流屬性。通過使用方法聲明中的屬性,您可以顯式地表示該方法的行為:

<RuleWrite("PassWordLevel")> _
Public Sub RefreshInternalState()
 Me.PasswordLevel = 1
End Sub
  RuleWrite 屬性表示方法將要修改指定的屬性;同樣,RuleRead 屬性表示方法將要從指定的屬性中進(jìn)行讀取。這樣,就可以為運(yùn)行時(shí)引擎提供明確清楚的信息以確保規(guī)則設(shè)置同步。

  最后,您可以編寫顯式調(diào)用對(duì)涉及的屬性進(jìn)行更新的操作。例如:

IF this.MinimumLength <= 8 THEN
RefreshInternalState()
Update("PasswordLevel")
  規(guī)則操作中的 Update 方法會(huì)計(jì)劃對(duì)包含指定屬性的所有規(guī)則進(jìn)行重估。
QQRead.com 推出數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)故障解析 常用數(shù)據(jù)恢復(fù)方案 硬盤數(shù)據(jù)恢復(fù)教程 數(shù)據(jù)保護(hù)方法 數(shù)據(jù)恢復(fù)軟件 專業(yè)數(shù)據(jù)恢復(fù)服務(wù)指南 循環(huán)和重復(fù)活動(dòng)

  這組活動(dòng)提供了典型的 While 活動(dòng)以及 Replicator 活動(dòng),這些活動(dòng)與典型的 For 循環(huán)有些共同點(diǎn)。While 活動(dòng)接受條件并在每次迭代開始時(shí)對(duì)該條件進(jìn)行計(jì)算。假如條件為“true”,該活動(dòng)將運(yùn)行指定的子活動(dòng)并重復(fù)直至條件為“false”。請(qǐng)注重在 While 主體內(nèi)答應(yīng)進(jìn)行單一活動(dòng)。因此,您可能要使用一個(gè)復(fù)合活動(dòng)(如 Sequence 或 Parallel)在循環(huán)中執(zhí)行多個(gè)活動(dòng)。(在此處,使用術(shù)語“交錯(cuò)”可能比“并行”更加準(zhǔn)確。因?yàn)闆]有涉及 Parallel 活動(dòng)的并發(fā),只有同一線程內(nèi)的交錯(cuò)。) 與 Foreach 語句類似,Replicator 活動(dòng)創(chuàng)建并執(zhí)行指定的子活動(dòng)的給定數(shù)量的實(shí)例。您可以只指定一個(gè)子活動(dòng),但答應(yīng)使用復(fù)合或自定義活動(dòng)。您不能通過聲明性屬性來控制迭代數(shù)。但是,您可以為初始化事件編寫一個(gè)處理程序,并針對(duì)各個(gè)需要的實(shí)例,使用初始化數(shù)據(jù)填充 CurrentChildData 集合:

Sub replicator1_Initialized(ByVal sender As Object, ByVal e As EventArgs)
 Console.WriteLine("Initializing ...")
 replicator1.CurrentChildData.Add("You are #1")
 replicator1.CurrentChildData.Add("You are #2")
 replicator1.CurrentChildData.Add("You are #3")
End Sub
  前面所述的代碼段規(guī)定了 Replicator 的子活動(dòng)的三個(gè)實(shí)例的順序,每個(gè)實(shí)例均使用給定的字符串進(jìn)行初始化。請(qǐng)注重,假如您將 CurrentChildData 集合置為空,Replicator 將不運(yùn)行任何子活動(dòng),并僅限于觸發(fā)頂級(jí)事件,如 Initialized 事件和 Completed 事件。您可以使用對(duì)象(不一定是字符串)初始化子活動(dòng),包括自定義類的實(shí)例。Replicator 還包括標(biāo)示各個(gè)子活動(dòng)初始化和完成的事件。默認(rèn)情況下,子實(shí)例按順序運(yùn)行,盡管通過設(shè)置 ExecutionType 屬性,您可以選擇并行執(zhí)行。假如需要并行執(zhí)行,在復(fù)制器開始并執(zhí)行并行線程前,可以創(chuàng)建所有子活動(dòng)實(shí)例。當(dāng)以順序模式執(zhí)行時(shí),只有當(dāng)前一個(gè)活動(dòng)結(jié)束時(shí)下一個(gè)活動(dòng)才能被實(shí)例化。 假如沒有通過 UntilCondition 屬性設(shè)置全局條件,Replicator 將在所有復(fù)制完成后才結(jié)束,否則,將在 UntilCondition 為“true”時(shí)終止活動(dòng)。值得注重的是,盡管在所有子活動(dòng)已完成并且 UntilCondition 屬性計(jì)算為“false”時(shí)活動(dòng)將被掛起,Replicator 也從不通過類似 While 循環(huán)中的子活動(dòng)進(jìn)行循環(huán)。在對(duì)活動(dòng)進(jìn)行全局實(shí)例化后,在每個(gè)子活動(dòng)完成后以及所有包括的活動(dòng)都已完成后,將對(duì) UntilCondition 進(jìn)行計(jì)算。但是有時(shí),假如條件計(jì)算為“true”,Replicator 將立即退出。

  您可以將 ConditionedActivityGroup (CAG) 活動(dòng)中的條件執(zhí)行和循環(huán)混合在一起。CAG 包含一些子活動(dòng)(可能是復(fù)合活動(dòng)),并可運(yùn)行這些活動(dòng),直至滿足全局條件。基本上,CAG 組合了 While 和 IfElse 活動(dòng)的行為。通過以下偽代碼來表示內(nèi)部邏輯:

While condition
 If child1.WhenCondition Then child1.Execute
 If child2.WhenCondition Then child2.Execute
 :
 If childN.WhenCondition Then childN.Execute
End While
  每個(gè)子活動(dòng)都有 WhenCondition 屬性。根據(jù)對(duì)指定條件的計(jì)算,可以在當(dāng)前的迭代中運(yùn)行或跳過活動(dòng)。請(qǐng)注重,假如子活動(dòng)沒有 WhenCondition 集合,子活動(dòng)將只能在第一次被執(zhí)行,并在后續(xù)的迭代中被跳過。假如需要,可以根據(jù)狀態(tài)變化的依存關(guān)系對(duì)所有條件進(jìn)行計(jì)算。

  在 UntilCondition 返回“true”并立即取消所有當(dāng)前正在執(zhí)行的活動(dòng)后,CAG 活動(dòng)將終止。假如沒有指定條件,當(dāng)因?yàn)闆]有設(shè)置條件或者條件計(jì)算為“false”而沒有子活動(dòng)運(yùn)行時(shí),CAG 也將結(jié)束。

  同步塊

  涉及交錯(cuò)活動(dòng)的順序工作流都會(huì)對(duì)共享成員的訪問進(jìn)行系列化。然而,操作是不同的。當(dāng)兩個(gè)或兩個(gè)以上以交錯(cuò)方式運(yùn)行的序列用到 Parallel 活動(dòng)時(shí),操作是不同的。請(qǐng)看一下圖 5。While 活動(dòng)包含兩個(gè)序列塊,然后,序列塊又將 Parallel 活動(dòng)和代碼活動(dòng)聯(lián)系在一起。在內(nèi)部,Parallel 活動(dòng)有四個(gè)塊,每個(gè)塊都對(duì)定義為工作流類成員的數(shù)字執(zhí)行數(shù)學(xué)運(yùn)算。Parallel 活動(dòng)的四個(gè)分支以交錯(cuò)方式執(zhí)行。(每一次在工作流實(shí)例中只有一個(gè)線程。該線程在 Parallel 活動(dòng)的分支間往返切換。)跨任務(wù)同步又如何呢?默認(rèn)情況下,子活動(dòng)內(nèi)部運(yùn)行的每一段代碼都進(jìn)行對(duì)共享成員的直接訪問。

Windows 工作流活動(dòng)技術(shù)概覽(圖五)
圖 5 平行任務(wù)(Click the image for a larger view)

  根據(jù)圖 5 所示的簡(jiǎn)單架構(gòu),可能會(huì)出現(xiàn)每個(gè)分支都作為一個(gè)原子操作來運(yùn)行的情況。這純屬巧合,運(yùn)行嚴(yán)格依據(jù)各操作的復(fù)雜性和持續(xù)時(shí)間。假如每個(gè)分支由多個(gè)活動(dòng)組成,情況會(huì)怎樣?SynchronizationScope 提供了聲明性和明確的同步存取建模方法,它可以實(shí)現(xiàn)對(duì)一組活動(dòng)中一個(gè)給定工作流實(shí)例內(nèi)的共享狀態(tài)進(jìn)行同步存取。

  SynchronizationScope 活動(dòng)內(nèi)運(yùn)行的工作流部分是一種不能中斷的原子操作。此處沒有事務(wù)語義,SynchronizationScope 活動(dòng)中包含的操作不能回滾。在所有基于活動(dòng)(這些活動(dòng)具有并行執(zhí)行路徑,如 Parallel、Replicator 和 CAG)的解決方案中,SynchronizationScope 活動(dòng)起著要害作用。

  圖 6 可以幫助您快速體驗(yàn) SynchronizationScope 活動(dòng)的作用,該圖是圖 5 中工作流的修改版本。blockMultiply 活動(dòng)對(duì)延遲交錯(cuò)的兩個(gè)代碼塊進(jìn)行計(jì)數(shù)。blockDivide 活動(dòng)包含一個(gè)未同步的代碼塊。假如您將 blockMultiply 的內(nèi)容放到同步范圍之外,blockDivide 將可能在 blockMultiply 的延遲階段執(zhí)行。根據(jù)要進(jìn)行的更新的種類不同,這可能會(huì)成為一個(gè)嚴(yán)重問題。SynchronizationScope 活動(dòng)可確保工作流部分的連續(xù)性。


Windows 工作流活動(dòng)技術(shù)概覽(圖六)
圖 6 平行任務(wù)與同步范圍(Click the image for a smaller view)
QQRead.com 推出數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)指南教程 數(shù)據(jù)恢復(fù)故障解析 常用數(shù)據(jù)恢復(fù)方案 硬盤數(shù)據(jù)恢復(fù)教程 數(shù)據(jù)保護(hù)方法 數(shù)據(jù)恢復(fù)軟件 專業(yè)數(shù)據(jù)恢復(fù)服務(wù)指南 異常處理

  正如其他基于 .NET 的應(yīng)用程序一樣,工作流能夠引發(fā)和捕捉異常。非凡是,您可以使用 Throw 活動(dòng)來引發(fā)一個(gè)特定的異常。Throw 活動(dòng)需要幾個(gè)設(shè)置 — 要引發(fā)的異常的類型,存儲(chǔ)異常對(duì)象實(shí)例以進(jìn)行進(jìn)一步自定義的工作流類成員。只要在工作流項(xiàng)目中引用了類型,您就可以使用自定義的異常類型。

  要捕捉工作流活動(dòng)引發(fā)的異常,您要添加 FaultHandler 活動(dòng)。工作流設(shè)計(jì)器提供了一個(gè)用于您添加的錯(cuò)誤處理程序的容器。每個(gè)處理程序一定是某個(gè)工作流的一部分,一旦捕捉異常,該程序即執(zhí)行。添加 FaultHandler 活動(dòng)后,您可以定義要捕捉的異常的類型。您可以通過 Fault 屬性訪問異常對(duì)象。值得注重的是,要可視化錯(cuò)誤處理程序,您必須在 Visual Studio 2005 設(shè)計(jì)器中切換視圖并通過單擊設(shè)計(jì)器視圖底部的選項(xiàng)卡列表來選擇“View Faults(查看錯(cuò)誤)”選項(xiàng)卡。

  事務(wù)

  .NET Framework 2.0 包括一個(gè)輕松而有效處理事務(wù)的對(duì)象 — 無論參與對(duì)象的數(shù)目和類型以及范圍如何,也無論事務(wù)是本地的還是分布式的。該對(duì)象被命名為 TransactionScope,一般情況下,您可以根據(jù)如下模式進(jìn)行使用:

Using ts As New TransactionScope
 ...
 ts.Complete
End Using
  TransactionScope 對(duì)象保證在出現(xiàn)故障的情況下,事務(wù)既可以被提交也可以被回滾,更為重要的是,它可以確定您需要一個(gè)本地事務(wù)還是一個(gè)分布式事務(wù),并登記所有必要的資源。當(dāng)代碼到達(dá)一個(gè)無法本地運(yùn)行的點(diǎn)時(shí),相應(yīng)地,TransactionScope 提升至分布式事務(wù)處理協(xié)調(diào)器 (DTC)。實(shí)施 ITransaction 接口的所有對(duì)象可以隨一個(gè)事務(wù)一起登記。該列表包括所有標(biāo)準(zhǔn) ADO.NET 2.0 數(shù)據(jù)提供程序,并且 Microsoft 消息隊(duì)列以兼容模式工作。

  值得注重的是對(duì)于分布式事務(wù),TransactionScope 和企業(yè)服務(wù)之間存在一些差別。TransactionScope 屬于專門針對(duì)基于 .NET 的應(yīng)用程序而設(shè)計(jì)的事務(wù)框架 — System.Transactions。在內(nèi)部,System.Transactions 命名空間的類有時(shí)會(huì)以為 DTC 和 COM+ 委派一些工作作為結(jié)束。為什么在這一點(diǎn)上 TransactionScope 至關(guān)重要?TransactionScope Windows Workflow Foundation 活動(dòng)僅僅是 TransactionScope .NET 類實(shí)例的一個(gè)工作流包裝程序。

  當(dāng)您為工作流添加 TransactionScope 活動(dòng)時(shí),您可以設(shè)置要完成的事務(wù)的超時(shí)時(shí)間,并設(shè)置所需的隔離級(jí)別。事務(wù)范圍內(nèi)組合的所有活動(dòng)形成了能夠?qū)崿F(xiàn)典型 ACID 架構(gòu)的工作單位。在所有子活動(dòng)都成功完成后將提交事務(wù),工作流繼續(xù)進(jìn)行到下一步。假如在范圍內(nèi)引發(fā)異常,TransactionScope 活動(dòng)自動(dòng)回滾。編寫事務(wù)性工作流并不要求您顯式地處理提交和回滾語義 — 假如您要提交事務(wù)和引發(fā)異常來中止事務(wù),您只需順其自然。該活動(dòng)將可以輕松治理其他任何事情。

  請(qǐng)注重,您不能嵌套兩個(gè)或兩個(gè)以上的 TransactionScope 活動(dòng)。同樣地,您不能使用 Suspend 活動(dòng)掛起事務(wù)內(nèi)的工作流。然而,您可以通過 Listen 或 EventHandlingScope 活動(dòng),將事件處理程序整合到事務(wù)中。在這種情況下,工作流主機(jī)應(yīng)當(dāng)包括持久性服務(wù),否則,假如工作流試圖將它的狀態(tài)保存為空閑狀態(tài),會(huì)引發(fā)異常。 此外,相關(guān)的活動(dòng),如 CompensatableTransactionScope 還支持補(bǔ)償。補(bǔ)償是在有后續(xù)業(yè)務(wù)預(yù)期的情況下,從邏輯上撤消已完成的事務(wù)的過程。補(bǔ)償與回滾不同,因?yàn)樗且环N當(dāng)工作流中發(fā)生違反規(guī)則的情況時(shí),取消已成功完成和提交的事務(wù)所產(chǎn)生的影響的有效方法。在兩個(gè)帳戶間進(jìn)行資金劃轉(zhuǎn)的事務(wù)是一個(gè)典型的回滾示例。第一個(gè)調(diào)用將資金從一個(gè)帳戶中取出,第二個(gè)調(diào)用將相同數(shù)額的資金劃轉(zhuǎn)至另一個(gè)帳戶。只要數(shù)據(jù)庫支持兩階段提交模型,假如在事務(wù)中引發(fā)異常,回滾可恢復(fù)一致的狀態(tài)。

  設(shè)想一下一個(gè)訂單處理工作流,其中一個(gè)事務(wù)被用于通過信用卡進(jìn)行支付。第一步,首先從信用卡中提取資金來支付貨款。然后,在交易成功完成后,該貨物不能再被銷售。假如違反了業(yè)務(wù)規(guī)則,需要按照合適的規(guī)定對(duì)交易結(jié)果進(jìn)行補(bǔ)償 — 一般是將資金劃入簽帳卡。

  通過右鍵單擊 CompensatableTransactionScope 活動(dòng),您可以切換到事務(wù)的“補(bǔ)償”視圖并添加所有補(bǔ)償事務(wù)影響所需的活動(dòng)。在圖 7 中,OrderScope 事務(wù)與補(bǔ)償活動(dòng)規(guī)定相關(guān)聯(lián),該規(guī)定要求在出現(xiàn)業(yè)務(wù)異常的情況下,應(yīng)將已提取的資金退回。正如我前面談到的,工作流中的異常是通過異常處理程序捕捉的。對(duì)于某一特定異常(如 ProdUCtDiscontinued),您可以調(diào)用一個(gè) Compensate 活動(dòng),該活動(dòng)已綁定到其影響作用已被取消的事務(wù)活動(dòng)。一般情況下,Compensate 活動(dòng)會(huì)觸發(fā)適用于任何可被補(bǔ)償?shù)幕顒?dòng)(即,適用于實(shí)施 ICompensatableActivity 接口的活動(dòng))的補(bǔ)償機(jī)制。與 CompensatableTransactionScope 一起,CompensatableSequence 也實(shí)施了本接口并能夠用于非事務(wù)性的補(bǔ)償情況。不過,您也可以編寫支持補(bǔ)償?shù)淖远x活動(dòng)。


Windows 工作流活動(dòng)技術(shù)概覽(圖七)
圖 7 事務(wù)與補(bǔ)償活動(dòng)(Click the image for a larger view) 

  調(diào)用其他代碼

  此外,還有一些活動(dòng)可調(diào)用和執(zhí)行代碼。這些活動(dòng)包括:Code、InvokeWorkflow、InvokeWebService 和 CallExternalMethod。Code 活動(dòng)最靈活,可以表示您在工作流某一點(diǎn)插入的自定義代碼塊。Code 活動(dòng)觸發(fā)您在工作流中處理的 ExecuteCode 事件,并能使其運(yùn)行您所需要的代碼。代碼將包含在工作流中并與其一起進(jìn)行編譯。Code 活動(dòng)可以調(diào)用外部程序集,只要您在 ExecuteCode 事件處理程序中加入所有能夠加載程序集和選擇方法的必要代碼。

  InvokeWorkflow 活動(dòng)可以引用工作流和異步調(diào)用工作流。您可以傳遞輸入?yún)?shù),但要注重 InvokeWorkflow 活動(dòng)要在被啟動(dòng)的工作流開始執(zhí)行之前完成。您無法將當(dāng)前工作流的執(zhí)行與外部工作流的執(zhí)行同步,也不能處理當(dāng)前工作流中的輸出參數(shù)。

  InvokeWebService 活動(dòng)可以通過代理類同步調(diào)用 Web 服務(wù)方法。使用 Code 活動(dòng)并調(diào)用 Web 服務(wù),可以對(duì)活動(dòng)的行為進(jìn)行模擬。

  最后,CallExternalMethod 活動(dòng)可用于調(diào)用本地服務(wù)方法。本地服務(wù)是對(duì)于實(shí)施以 ExternalDataExchange 屬性修飾的接口的工作流可用的任何類。另外,代表本地服務(wù)的類必須作為外部數(shù)據(jù)交換服務(wù)添加到工作流運(yùn)行時(shí)。

Dim service As New ExternalDataExchangeService
runtime.AddService(service)
Dim localService As New YourService()
service.AddService(localService)
  您可以配置 CallExternalMethod 活動(dòng)以調(diào)用由本地服務(wù)實(shí)施的接口的方法。為什么 CallExternalMethod 僅限于調(diào)用已知接口的方法?原因在于活動(dòng)不僅僅是代碼執(zhí)行者,而是旨在與 HandleExternalEvent 活動(dòng)一起實(shí)施與本地服務(wù)的雙向交流。借助 CallExternalMethod 活動(dòng),通過將 HandleExternalEvent 活動(dòng)加入工作流,您可以調(diào)用服務(wù)方法,處理服務(wù)引發(fā)的事件。

  總結(jié)

  活動(dòng)是工作流的構(gòu)造塊。通過在 Visual Studio 2005 設(shè)計(jì)器中撰寫活動(dòng),您可以創(chuàng)建工作流解決方案。與 ASP.NET 中的服務(wù)器控件和 Windows Forms 中的控件類似,工作流活動(dòng)是解決方案的精華所在并形成了開發(fā)人員的主要工具箱。Windows Workflow Foundation 提供了一些隨機(jī)活動(dòng)。在此,我要回顧一下涵蓋事務(wù)、并行和條件執(zhí)行、循環(huán)以及異常處理的活動(dòng)。wf.netfx3.com 上提供了解一些其他免費(fèi)活動(dòng)。將它們挑出來!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 达州市| 监利县| 沙河市| 仪陇县| 北海市| 宜兴市| 威远县| 四平市| 中山市| 广安市| 齐河县| 泽普县| 深水埗区| 裕民县| 财经| 玛沁县| 洞头县| 三台县| 朝阳市| 太和县| 汝南县| 谢通门县| 扶沟县| 那坡县| 平舆县| 溧水县| 奉化市| 阜新市| 鹤岗市| 台南市| 黄平县| 扎赉特旗| 阿勒泰市| 乌什县| 新兴县| 小金县| 庆城县| 光山县| 石景山区| 湛江市| 博罗县|