[WWF] 如何從外部傳值給 WF Instance

[Develop] 如何從外部傳值給 WF Instance

這一篇範例一開始浩呆還是要特別強調Workflow Foundation 不是一個簽核流程軟體,但是多半在討論Workflow Foundation 時,我還是會以簽核軟體的概念來討論我們要做的範例。

這樣研究起來比較容易理解。這次的研究流程是如何讓你的WWF流程在被建立起來後,執行到一半流程變停下來,等待外部( 宿主程序 )回傳一個值給WF,接著WF再繼續。

在這邊我們可以想像成,當你在撰寫簽核流程時,可能會遇到以下的情況,例如 『簽核到某一關的時候,需要那一關的人填入一些資訊流程才能往下跑。』。再舉一個更具體的例子

『當你在公司申請東西,簽核到總務時,總務會依據你申請的物品來填上金額。和金額可能會影響的簽核時要不要加簽到特定人物。』。

這樣有具體一點了嗎? 所以這次研究我們就來了解要如何將『值』從『宿主程序傳進去WWF流程實體中』。

 

因為這篇研究會討論到handleExternal Activity,如果你沒用過這個Activity的話,在開始前可以先閱讀另一篇文章。

Lab6-Handle Call ExternalActivity
http://www.dotblogs.com.tw/toysboy21/archive/2011/03/17/21900.aspx

 

這個研究我們要做的是讓WF流程在被建立後就進入等待狀態,等到外部有直傳進來後WF流程才會繼續往下。而我們會將傳入的值保留下來。

接著流程又會遇到handleExternal Activity而停下來,然後這時我們可以在宿主程序上再輸入值。而這個值也會被保留下來。

最後我們列印出這兩次輸入的值。

 

 

1. 首先我們要建立一個Interface,來讓外部應用程式可以藉由這個Event 來將值回傳給WorkflowInstance.

clip_image002

 

2. 接著建立一個自訂的Activity.

2.1 在自訂的Activity中我拉進了一個handleExternalEventActivity跟 一個 CodeActivity. handleExternalEventActivity是用來讓外部應用程式傳遞資訊進到Workflow Instance的.

而CodeActivity我在裡面寫了System.Windows.Forms.MessageBox.Show(this.Name); 是讓流程執行時可以跳出訊息來告知前端目前的Acvivity名稱.

clip_image004

 

2.2 在自訂的Activity中我建立了一個 prtvate String 的屬性,這邊是後續要讓外部應用程式來更改的屬性.

clip_image006

 

3. 接著建立一個自訂的Activity.

3.1 在流程中我們拉出兩個剛剛我們建立的Activity 和 一個CodeActivity.

CodeActivity 主要是在最後要驗證在MyActivity1 與 MyActivity2中所被更改的值是否有被保留下來.

clip_image008

 

3.2 在handleExternalEventActivity1_Invoked 方法中. 我們接收回傳的ExternalDataEventArgs 並且列印出內容值.

clip_image010

 

4. 接著新增一個Window Form的專案.

4.1    在Windows Form 中我們新增了3個按鈕.第1個按鈕是用來啟動流程,第2個按鈕我們用來修改自訂的Activity的屬性內容.

clip_image012

 

4.2    在按下第2個Button時我們去new 一個DataExchangeEventArgs並且把 Textbox1的值傳給他,然後我們呼叫DataExchange的方法把Data送回給Workflow.

 

clip_image014

 

 

5. 接著新增一個Window Form的專案.

5.1 執行這隻程式,我們啟動這個流程.流程開始後會呈現Idled的狀態.

clip_image016

 

5.2 在Textbox裡輸入數字並且按下”改myActivity的屬性” 的按鈕.此時可以改變Activity1裡的UserText屬性值.而流程會接續下去,在Workflow裡遇到了第二個Activity後又會停下來.

clip_image018

 

5.3 接著你在輸入資訊,這時資訊則是被傳入到第2個myActivity中的屬性值.

clip_image020

 

5.4 在流程的最後我們一起列印出Activity1與Activity2的屬性值.

clip_image022