[Develop] 動態新增Activity元件到Workflow中
這邊我們要做一個測試,用外部應用程式來動態改變Workflow。這種情況在某些簽核系統中很常見。
例如有時候我們設計好一個簽核流程,常常會遇到一種情況就是。流程跑到某一關後,簽核人判斷這個表單可能要加簽給總經理,但是原本的流程可能沒有這一關。
所以簽核人做了”加簽”與”會簽”之類的動作。這時可能你就會需要動態的產生一個關卡。
在這個範例中我們會有兩個專案,一個是WorkflowLibrary另一個則是Host程式(宿主程式)Windows Form專案。
在Workflow1專案中我們新增一個Activity1。(這邊可以把常用或是複雜的Activity設計成自訂的Activity,這樣元件可以很簡單的呼叫)。並且在這個Activity中我們加入一個codeActivity。
接著我們在Workflow專案中加入了System.Windows.Forms的參考。
在codeActivity上點兩下進入到程式編輯頁面。我們在codeActivity_Excutecode裡面寫了下方的程式 :
System.Windows.Forms.MessageBox.Show(this.Name);
這部分是要讓流程運行到這邊時跳出訊息視窗來確認我們目前所在的這個Activity的名稱。
(在這邊記得先編譯程式,否則無法在工作流程中看到我們自行建立的Activity。)
接著我們建立一個循序工作流程,我們在裡面拉入兩個元件。
suspendActivity1與我們剛剛自訂的activity,這邊待會我們要讓流程一開始運行的時候就停住。好讓我們可以由外部加入新的Activity。完成後編譯這個工作流程。
接著我們到我們的Windows Form程式中,我們拉出3個Button到Window Form。
每個Button 的功用如同其上方的名稱。我們用第一個按鈕來啟動這個流程。用第2個按鈕來繼續被暫停的流程。第3個按鈕是用來加入新的Activity到流程中。
然後在Windows Form程式中我們要記得加入
System.Workflow.Activities,System.Workflow.ComponentModel 與 System.Workflow.Runtime
3個元件的參考。
接著就是去建立運行WWF所必須要用的物件。
在這邊我們會在特別處理workflowRuntime.WorkflowSuspended 與
workflowRuntime.WorkflowCompleted 兩個事件,分別用來通知前端流程被暫停了以及流程執行完畢。
接下來我們來看每一個Button按鈕的相關程式碼。
首先在啟動流程按鈕我們會呼叫剛剛撰寫的Workflow1流程。,。,。,。
因為流程一啟動就會遇到暫停,所以我們這邊用WorkflowInstance.Resume的方式來使流程繼續。
再來就是這次的重點了,要加入新的Activity到流程中。
1. 我們用workflowInstance.GetWorkflowDefinition 傳回整個跟流程,也就是這一個Workflow 。
2. 接著我們new出一個Activity1,這是我們在workflow裡面建立的自訂Activity。可以在namespace裡找到這個類別。
3. 接著我們要New出一個WorkflowChanges類別,要使用 WorkflowChanges 這個物件,對執行中的工作流程執行個體進行所有建議的變更。
4. 最後我們在Workflow流程中的新增我們剛剛建立的Activity。並且Apply這個Change。
都完成後我們編譯執行這隻Windows Form程式。一開始我們去啟動流程後會跳出MessageBox通知我們流程被暫停了。
如果這時你按下流程繼續的Button後,會跳出另一個Messagebox,告知目前執行的是Activity1。接著就完成這一個工作流程了。
所以我們再重新啟動一次流程,當流程被暫停後。我們按下動態加入元件的Button,
之後你會看到多談出了一個activity2的Message。我們這邊可以確認自訂的Activity元件已經被加入流程裡了。
相關的參考文章:
WorkflowInstance Class
http://msdn.microsoft.com/en-us/library/system.workflow.runtime.workflowinstance.aspx
WorkflowChanges 類別
http://msdn.microsoft.com/zh-tw/library/system.workflow.componentmodel.workflowchanges.aspx
WorkflowChanges.TransientWorkflow 屬性