Windows WorkFlow Foundation入門(二)
二、使用WF開發(fā)介紹
WF允許我們用.net framework來開發(fā)自己的工作流程序,它并不是一個可執(zhí)行程序,但它使得我們能開發(fā)自己的工作流應用程序。
傳統(tǒng)的通用編程語言致力于開發(fā)短生命期的程序,它們?nèi)狈Τ绦蜻\行的持續(xù)性和穩(wěn)固性的內(nèi)在的支持。WF是一個框架,不是一門語言。它對工作流編程有著深入的理解,從而能很好的處理諸于persistence and compensation這樣的工作。
WF是靈活的,可擴展的。你可以直接通過代碼或markup(?)來編寫工作流,可使用兩者組合。你可以通過定義可重用的活動來,來實現(xiàn)自定義的工作流模式。
WF支持模型驅(qū)動的工作流開發(fā),它支持自然的可視化設計,同時隱藏了一些系統(tǒng)級的概念,如事務、狀態(tài)管理以及并發(fā)控制。
開發(fā)工作流程序有兩件基本的事情,一是定義工作流和它的活動,再就是在程序使用這些工作流。
(一)工作流程模式
WF支持多種工作流程式,如順序工作流,以及數(shù)據(jù)驅(qū)動。順序模式是一直向前執(zhí)行,它在重復和、可預見的操作(這些操作通常相同)中非常有用。狀態(tài)機模式由一系列事件驅(qū)動的狀態(tài)組成,數(shù)據(jù)驅(qū)動模式依賴于數(shù)據(jù)來決定某個活動是否執(zhí)行。
順序工作流
順序模式是一直向前執(zhí)行,它在重復和、可預見的操作(這些操作通常相同)中非常有用,例如,一系列的活動以規(guī)定的、通常相同的順序來運行。參見下圖。
順序工作流以按順序執(zhí)行的方式來執(zhí)行活動,直到最后一個活動執(zhí)行完成。順序工作流不一定是完全確定的,即使在非正常操作中。例如,你可以使用一個“監(jiān)聽”活動或一個“并發(fā)”活動,事件的具體順序在不同的情況下可以不同。
狀態(tài)機工作流
在狀態(tài)機模型中,工作流就是一個狀態(tài)機,它由一系列的狀態(tài)組成。其中一個狀態(tài)指示了開始狀態(tài),每個狀態(tài)都可以接收一系列的事件。基于一件,工作流從一個狀態(tài)遷移到另一個狀態(tài)。狀態(tài)機工作流可以有一個終結(jié)狀態(tài),當遷移到終結(jié)狀態(tài)時,工作流就完成了。
下面這幅圖是一個狀態(tài)機工作流的例子。
下面這張表列出了在WF框架的活動集合中與狀態(tài)機相關(guān)的活動
| 活動 | 說明 |
| EventDrivenActivity |
用于依賴于外部事件才能開始執(zhí)行的狀態(tài)。EventDrivenActivity必須有一個Activity實現(xiàn)在了IEventActivity 接口,作為其第一個子活動。 |
| SetStateActivity | 用于遷移到一個新狀態(tài)。 |
| StateActivity |
代表狀態(tài)機中的一個狀態(tài),可以包含附加的“狀態(tài)”活動 |
| StateInitializationActivity |
當進一個狀態(tài)時執(zhí)行,可以包含其它活動。 |
| StateFinalizationActivity | 當離開一個StateActivity時會執(zhí)行它所包含的活動。 |
使用活動來控制流程
WF框架包含不同功能的活動,我們可以這些活動來控制工作流的邏輯流程。
下面這張表列出了在WF框架的活動集合中用來控制工作流邏輯流程的活動。
| 活動 | 說明 |
| ListenActivity | 可以根據(jù)一些事件或超時操作來產(chǎn)生分支。 |
| IfElseActivity | 在每個分支上測試同一個條件,并且執(zhí)行第一個返回True的分支上的活動。 |
| ParallelActivity | 可以使工作流同時執(zhí)行兩個以上互不相關(guān)的操作。 |
| SuspendActivity | 掛起一個操作,可以產(chǎn)生錯誤用來干預流程。 |
| TerminateActivity | 當錯誤發(fā)生時,可以用來立即終止工作流中的一個操作。 |
| WhileActivity | 循環(huán)執(zhí)行一個操作,執(zhí)行指定的條件得到滿足。 |
| ConditionedActivityGroup | 也被稱為CAG。當設定到CAG的條件滿足時,會執(zhí)行CAG包含的子活動。子活的執(zhí)行也必須滿足該子活動設定的條件。 |
| EventDrivenActivity | 它是一個包含另一個活動的活動,在指定的事件發(fā)生時執(zhí)行。 |
在工作流中使用條件
我們可以通過條件來控制工作流的狀態(tài)。運行時引擎會自動判別一個條件,并根據(jù)判別的結(jié)果來執(zhí)行某一些操作。
有兩種方式來表達工作流中的條件:
一是代碼方式,編寫一個Handler返回Bool值;(注:以下譯作代碼條件)
二是通過工作流定義中的規(guī)則(rule)。(注:以下譯作規(guī)則條件)
我們可以在運行的時候動態(tài)的更新規(guī)則條件來改變工作流的行為。
我們還可以使用PolicyActivity,通過規(guī)則來完成有條件的行為。
條件活動
WF提供了多個使用條件的活動:
- IfElseActivity分支:基于對條件結(jié)果的判別。
- WhileActivity:只要條件保持為True,就會持續(xù)的執(zhí)行它包含的所有活動。條件的值會在每次循環(huán)執(zhí)行時重新進行判別。
- ConditionedActivityGroup:持續(xù)的執(zhí)行它包含的所有活動直到其條件為真,它包含的每個活動都有一個When條件,只有當When條件為真時,活動才會執(zhí)行。
你可以在你創(chuàng)建的工作流中自定義條件。
注意:規(guī)則條件可以引用public成員(即在你的工作流類中定義的變量或方法),而代碼條件可以引用public或private成員。
使用規(guī)則條件
規(guī)則條件在條件表達式編輯器中定義,根據(jù)工作流狀態(tài)和數(shù)據(jù)來確定條件的值。運行時引擎會判別這個條件,從而決定要不要讓與之相聯(lián)的活動執(zhí)行或使之可用。
規(guī)則條件非常有用,因為你在運行的時候可以修改它們,這意味著你可以不用停止、修改或編譯你的工作流就可以改變它的行為。
可以使用下面的要素來構(gòu)建規(guī)則條件:
- 邏輯操作符,如AND,,OR, NOT
- 算術(shù)操作符,如+,-,*,/
- 工作流中的public成員,間接地使用其它程序集中的成員
對包含復雜類型的變量的嵌套調(diào)用,這種變量如:this.Address.State == "WA"
注意:if關(guān)鍵字會被自動添加到條件語句的前面,但它不會顯示在這個語句中。
動態(tài)更新規(guī)則條件
你可以通過動態(tài)更新規(guī)則條件,在工作流運行的時候修改它的行為,而不需要重新編譯。
條件會作為活動的一個屬性出現(xiàn),這些活動諸如:WhileActivity, IfElseActivity, ReplicatorActivity, 和 ConditionedActivityGroup。宿主程序會顯式的更新這些條件定義,更新后的條件會在下次條件被判別時使用到。
因為條件是可序列化的,如果工作注被暫停或終止時,更新后的條件也會被保存。
重要:任何動態(tài)更新只能當前正在運行的實例有效,而不會影響到工新創(chuàng)建的作流實例。
使用代碼條件
要以用C#或VB.net來創(chuàng)建條件。代碼條件簡單看,是分隔代碼的處理器,它為ConditionalEventArgs.Result設置一個布爾值。代碼條件被編譯后,成為程序集一的部份。運行時引擎執(zhí)行這個方法,并返回一個一個布爾值作為代碼條件的判別結(jié)果。
下面的例子是一個用于判別某個值是否大于10的一個代在條件:
{
e.Result = (this.CustomPropertyValue > 10);
}
浙公網(wǎng)安備 33010602011771號