[Develop]Lab12-MultiAP_Call_StateMachine

[Develop]Lab12-MultiAP_Call_StateMachine

Lab12 、MultiAP_Call_StateMachine

認識浩呆的人大概都聽浩呆說過一個概念,應用程式撰寫的彈性。我常常拿捷運的票價系統來舉例。早期剛有捷運的時候,不知道大家還記不記得;那個時候我們投錢去買票時,出來的票都是

一張帶有磁條的票。然後我們過捷運閘門就是用這張票。後來有一陣子捷運將這個磁條片置換成一個圓形的塑膠幣,然後有一小段時間捷運可以看到兩種閘道跟售票機共存。(
這要有點年紀的人才有看過,

可能有些小朋友就沒看過磁條了…><||||| ) 這時我們來討論應用程式開發的彈性問題。對於扣款的程式來說,不管你用的票是磁條卡還是圓形塑膠幣,從台北到淡水的價格都是一樣的。

磁條卡還是圓形塑膠幣影響的只是資料來源端的硬體設施不同,讀取的資料的設備也許是走 TCP/IP 協定過來、也可能是個RS232…..等等等。所以在開發程式時,如何保持程式擴充的彈性就變的很重要。

你總不會為了磁條卡或是圓形的塑膠幣去寫兩套扣款系統吧。那萬一將來有奇怪的新設備被研發出來了,你不就要再重新寫第三套扣款程式 ????????????????。那這樣修改程式的時候,你因該就會無比的痛苦了。

如果以下圖的方式開發,當一個新的應用程式( 例如: Windows Form )要就用這個流程的時候,只需要在新增一個 [ EventDriven
] 然後再做設定就可以了。在基礎通訊協定的部份還可以搭配 WCF 來使用 !! 整體來說因該

還蠻有彈性的吧!!

clip_image001


開啟一個新的WWF專案。

這個範例中我們要使用的是 [ 循序工作流程程式庫 ] 。檔案名稱我們命名為 [ Lab12_MultiStateMachine ] 。

clip_image002


加入兩個介面。

專案中我們先加入兩個介面,在專案的地方按下滑鼠右鍵選擇加入新項目,我們在這邊選擇 [ 介面 ] 。並且命名為 [ IWebService
],這個介面是用來宣告WebService 的方法以及傳入值跟回傳值用的介面。

我們如下圖右邊輸入輸入介面的方法宣告。

interface IWebService{

String method1(String requestMessage);

}

clip_image003

clip_image004

接著新增第二個介面,這個介面是要給外部應用程式叫用WWF流程所使用。介面名稱我們定為 [ IWebPage ]。然後按照右圖輸入程式碼。

clip_image005

clip_image006


狀態機工作流程設定。

在狀態機主要工作區塊中我們拉出向下圖一樣的元件分佈。,

clip_image007

然後在狀態機工作面板上按下滑鼠右鍵,選擇 [ 程式碼檢視 ]進入程式編輯頁面 。 然後我們宣告兩個變數 _RequestMessage ,
_ResponseMessage,因為兩個變數都是 Private,所以我們要宣告

存取兩個變數的方法。_RequestMessage 顧名思義就是要接收外部應用程式傳進來的值, _ResponseMessage 是WWF
要傳出去的值。

clip_image008

接著我們在 循序工作流程上的[ Workflow1InitiaState ] 裡面的第一個 [ WSCallStateMachine ]
的EventDriven 上點兩下,進到設定區域。我們從工具箱裡面拉一個 [ webServiceInputActivity ] 元件到工作區域中,然後

設定他的屬性。

1. InterfaceType = Lab12_MultiStateMachine.IWebService。

2. EventName = method。

3. Path = RequestMessage

clip_image009

clip_image010

clip_image011

接著我們在 循序工作流程上的[ Workflow1InitiaState ] 裡面的第二個名為 [ WebAPCallStateMachine
] 的EventDriven 上點兩下,進到設定區域。我們從工具箱裡面拉一個

[ handleExternalEventActivity ] 元件到工作區域中,然後設定他的屬性。

1. InterfaceType = Lab12_MultiStateMachine.IWebPage。

2. EventName = eventdriven。

clip_image012

clip_image013

clip_image014

接著我們先到 循序工作流程上的[ StateActivity3] 的 [ stateInitializationActivity1 ] 上點兩下,進到設定區域。我們從工具箱裡面拉一個

[ webServiceOutputActivity1 ] 元件到工作區域中,然後設定他的屬性。

1. InputActivityName = webServiceInputActivity1。這是WebService Output 元件,他必須對應到一個
WebService InPut 元件。這樣一個WebService 才可以完整的被建置。

2. Path = ResponseMessage

clip_image015

clip_image016

clip_image017

接著我們再到 循序工作流程上的[ StateActivity1] 的 [ stateInitializationActivity2 ] 上點兩下,進到設定區域。我們從工具箱裡面拉一個

[ CodeActivity ] 元件到工作區域中,然後再拉出一個 [ IfActivity ]。這個[ IfActivity ] 是用來分開
[ setStateActivity3 ] 與 [ setStateActivity4 ] 兩個元件用的。

這兩個元件是負責連接到你在 [ 循序工作流程 ] 上的指定連接。可以想像成只要執行到這個元件就會很像觸動超連結一樣,跳到你指定的連接去!!!

在這邊我們如果是經由 WebService 啟動這個流程的話,到這邊要走左邊的路徑。反之,你是由網頁應用程式啟動的話。我們走右邊的路徑。為什麼

這樣安排呢? 其實很單純的只是因為 WebService 的 Output 元件被我們放再另外的一個 StateActivity 裡面了,所以我們要做這樣的設定以確保萬一是經由

WebService 啟動這個流程的話,WebService 能找到結束的對應。

clip_image018

clip_image019

在 [ codeActivity1 ]上點兩下,進入程式編輯區域。我們撰寫下方右圖這樣的簡單程式,來告知前端使用者。這個流程是被什麼樣的應用程式所啟動的

clip_image020

clip_image021

然後再到 [ IfActivity ] 元件裡面設定條件判斷式。

我們在條件屬性區域裡面的 [ Condition ] 選擇 [ 宣告式規則條件 ]。按下 [ ConditionName ]進入 選取條件的編輯視窗。

clip_image022

clip_image023

我們新增一個條件式,在裡面我們輸入 this._RequestMessage == "webservice" 來做判斷。假如你是由
WebService 的方式啟動網站的話,就會走到左邊的區塊。反之,

則是走到右邊的區塊。

clip_image024

clip_image025

設定完成我們到專案上按下 [ 建置 ],並且按下滑鼠右鍵選擇 [ 發行為 Web 服務 ]。將網站發行成為 Web Service !!!

clip_image026

clip_image027

運氣好的話會看到一切都建置成功!!! 這是 WWF 幫我們發行出來的WebService。

clip_image028


加入新網站來呼叫WWF。

我們加入一個新網站,網站名稱命名為 [ Lab12_ASPNet_Call_MultiStateMachine ]。

clip_image029

clip_image030

我們在 [ Default.aspx ] 裡面加入一個 Label 跟 一個 Button。

clip_image031

在網頁的部分我們在加入參考 3個 Workflow Foundation 所必要的元件,還有剛剛完成的WWF專案。

clip_image032

clip_image033

然後我們先作前置宣告,我們增加了五個新的項目。

clip_image034

我們新增一個方法為 workflowCompleted ,這個是要委派給工作流程結束事件時啟動的方法。

clip_image035

接下來我們在網頁上按鈕點兩下,輸入下方的程式碼。主要是用來啟動工作流程,然後傳入 "Web網頁啟動"。將值傳入進去。

並且取得回傳的值。

clip_image036


測試Web應用程式呼叫工作流程。

都輸入完成後~我們來測試結果。在 .net 網站專案上直接編譯執行。測試我們的網站呼叫工作流程!!

clip_image037

clip_image038


測試
WebService 呼叫工作流程。

在工作流程所發行的Web服務上,我們找到副檔名是 asmx 的檔案,然後按下滑鼠右鍵選擇 [ 在瀏覽器中檢視 ]。

clip_image039

clip_image040

接著我們來測試結果!! 記得在輸入的框框中我們要輸入 "webservice" 喔!! 還記得我們的工作流程有一個 [
ifActivity ]是用得到的字串來判斷是不是 WebService 呼叫。所以我們要在

輸入的框框中打上 "webservice" 喔!! 然後就可以看到回傳的結果了~^^y

clip_image041

clip_image042