關于動态更新
在開發工作流時,我們會在工作流設計器中通過拖拽活動,設定屬性等等來設計我們的工作流,我們希望我們在設計時定義好的工作流在運作時是不變的。但在實際中我們往往需要在運作時來改變工作流的架構,例如我們已經定義好的流程在沒有結束時我們需要增加一個流程點,這個時候我們就需要使用動态更新來現實。在WF中我們也可以對正在運作的工作流執行個體添加删除活動,修改活動,規則條件等。當動态更新應用到工作流執行個體上時,隻影響目前的工作流執行個體。其他的和将來的都不受影響,仍然使用原始的工作流定義。
動态更新不适合要進行整體更改的情況,因為這将導緻工作流與原始設計原則産生極大差别。 在此類情況下,應設計一個新的工作流,而不是對正在運作的執行個體進行更改。動态更新不必重新編譯和重新啟動工作流。
何時進行動态更新
我們可以從工作流的執行線程内部和外部對正在運作的工作流執行個體進行動态更新。 在内部,我們可以使用CodeActivity,自定義活動等來實作,由于工作流運作在單一的線程上,是以我們執行動态更新的時候不會有其他的活動在執行。 在外部,我們實作動态更新就有嚴格規定,主要有以下狀态可以在宿主程式中進行動态更新:
1. 工作流執行個體建立完成,但是沒有開始。
2. 工作流執行個體是挂起狀态,沒有恢複。
3. 工作流執行個體是空閑狀态。
我們可以在WorkflowRuntime的WorkflowCreated,WorkflowSuspened,WorkflowIdled事件中來完成動作更新。WorkflowCreated事件在workflowRuntime.CreateWorkflow方法調用後引發,使用使用SuspendActivity可以使工作流轉到挂起狀态,引發WorkflowSuspened事件。使用DelayActivity或HandleExternalEventActivity時工作流會進入Idle狀态,引發WorkflowIdled事件。
動态更新的一般步驟
我們通過以下幾個步驟進行動态更新:
1.所有對運作中工作流執行個體的建議的更改必須使用WorkflowChanges對象進行。首先我們要建立一個該類的執行個體,構造函數中需要需要傳遞被更改的工作流執行個體的根活動。如果你是使用内部實作動态更新的方式,你直接傳遞this關鍵字就可以了。如果你是在外部宿主程式中,你需要使用workflowinstance的GetWorkflowDefinition方法來擷取工作流執行個體的根活動。
2.WorkflowChanges對象被建立後。該對象的TransientWorkflow屬性傳回該工作流執行個體的克隆版本,我們會對該克隆版本進行更改,然後将更改應用到運作中的工作流執行個體。
3.我們需要找到你要添加或删除活動的父活動,可以使用CompositeActivity的Activities屬性或是使用GetActivityByName方法來确定父活動,然後使用Add或Insert方法來添加或插入新的活動。移除活動使用remove方法。
4.使用WorkflowChanges的Validate方法來驗證,如果有錯誤會傳回ValidationError對象集合。
5.驗證通過後就可以更新了,如果是在外部實作動作更新需要調用workflowinstance對象的ApplyWrokflowChange方法,内部的話就調用目前對象的ApplyworkflowChanges方法。
阻止動态更新
順序和狀态機工作流都有一個DynamicUpdateCondition屬性,如果你沒有設定該屬性工作流一直允許動态更新,當你設定了該屬性後,當你在調用ApplyWorkflowChanges方法時就會去計算,如果為true則允許進行動态更新,否則就會抛出異常。
動态更新執行個體
下面我們分别使用在工作流内部和外部兩種方式來舉例說明,首先我們建立一個順序型工作流控制台程式,工作流設計如下圖:

工作流代碼如下:
<a href="http://11011.net/software/vspaste"></a>
我們會在運作時給該工作流中的sequenceActivityContainer添加一個自定義活動PrintActivity,該自定義活動僅僅向控制台輸出一條語句,代碼如下:
3.從上圖可以看出我們自定義的PrintActivity活動在運作時添加到了工作流執行個體當中,以上我們是在宿主程式中執行動态更新的,我們也可以在工作流内部來完成,例如我們将動态更新的代碼放到我們重寫的Initialize方法中,我們隻要将如下代碼做更改即可:
WorkflowChanges wc = new WorkflowChanges(this);
try { this.ApplyWorkflowChanges(wc); }
本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/11/03/DynamicUpdate.html,如需轉載請自行聯系原作者