[Develop]Lab12-MultiAP_Call_StateMachine
Lab12 、MultiAP_Call_StateMachine |
認識浩呆的人大概都聽浩呆說過一個概念,應用程式撰寫的彈性。我常常拿捷運的票價系統來舉例。早期剛有捷運的時候,不知道大家還記不記得;那個時候我們投錢去買票時,出來的票都是 一張帶有磁條的票。然後我們過捷運閘門就是用這張票。後來有一陣子捷運將這個磁條片置換成一個圓形的塑膠幣,然後有一小段時間捷運可以看到兩種閘道跟售票機共存。( 可能有些小朋友就沒看過磁條了…><||||| ) 這時我們來討論應用程式開發的彈性問題。對於扣款的程式來說,不管你用的票是磁條卡還是圓形塑膠幣,從台北到淡水的價格都是一樣的。 磁條卡還是圓形塑膠幣影響的只是資料來源端的硬體設施不同,讀取的資料的設備也許是走 TCP/IP 協定過來、也可能是個RS232…..等等等。所以在開發程式時,如何保持程式擴充的彈性就變的很重要。 你總不會為了磁條卡或是圓形的塑膠幣去寫兩套扣款系統吧。那萬一將來有奇怪的新設備被研發出來了,你不就要再重新寫第三套扣款程式 ????????????????。那這樣修改程式的時候,你因該就會無比的痛苦了。 如果以下圖的方式開發,當一個新的應用程式( 例如: Windows Form )要就用這個流程的時候,只需要在新增一個 [ EventDriven 還蠻有彈性的吧!! |
開啟一個新的WWF專案。
這個範例中我們要使用的是 [ 循序工作流程程式庫 ] 。檔案名稱我們命名為 [ Lab12_MultiStateMachine ] 。
加入兩個介面。
專案中我們先加入兩個介面,在專案的地方按下滑鼠右鍵選擇加入新項目,我們在這邊選擇 [ 介面 ] 。並且命名為 [ IWebService
],這個介面是用來宣告WebService 的方法以及傳入值跟回傳值用的介面。
我們如下圖右邊輸入輸入介面的方法宣告。
interface IWebService{
String method1(String requestMessage);
}
接著新增第二個介面,這個介面是要給外部應用程式叫用WWF流程所使用。介面名稱我們定為 [ IWebPage ]。然後按照右圖輸入程式碼。
狀態機工作流程設定。
在狀態機主要工作區塊中我們拉出向下圖一樣的元件分佈。,
然後在狀態機工作面板上按下滑鼠右鍵,選擇 [ 程式碼檢視 ]進入程式編輯頁面 。 然後我們宣告兩個變數 _RequestMessage ,
_ResponseMessage,因為兩個變數都是 Private,所以我們要宣告
存取兩個變數的方法。_RequestMessage 顧名思義就是要接收外部應用程式傳進來的值, _ResponseMessage 是WWF
要傳出去的值。
接著我們在 循序工作流程上的[ Workflow1InitiaState ] 裡面的第一個 [ WSCallStateMachine ]
的EventDriven 上點兩下,進到設定區域。我們從工具箱裡面拉一個 [ webServiceInputActivity ] 元件到工作區域中,然後
設定他的屬性。
1. InterfaceType = Lab12_MultiStateMachine.IWebService。
2. EventName = method。
3. Path = RequestMessage
接著我們在 循序工作流程上的[ Workflow1InitiaState ] 裡面的第二個名為 [ WebAPCallStateMachine
] 的EventDriven 上點兩下,進到設定區域。我們從工具箱裡面拉一個
[ handleExternalEventActivity ] 元件到工作區域中,然後設定他的屬性。
1. InterfaceType = Lab12_MultiStateMachine.IWebPage。
2. EventName = eventdriven。
接著我們先到 循序工作流程上的[ StateActivity3] 的 [ stateInitializationActivity1 ] 上點兩下,進到設定區域。我們從工具箱裡面拉一個
[ webServiceOutputActivity1 ] 元件到工作區域中,然後設定他的屬性。
1. InputActivityName = webServiceInputActivity1。這是WebService Output 元件,他必須對應到一個
WebService InPut 元件。這樣一個WebService 才可以完整的被建置。
2. Path = ResponseMessage
接著我們再到 循序工作流程上的[ StateActivity1] 的 [ stateInitializationActivity2 ] 上點兩下,進到設定區域。我們從工具箱裡面拉一個
[ CodeActivity ] 元件到工作區域中,然後再拉出一個 [ IfActivity ]。這個[ IfActivity ] 是用來分開
[ setStateActivity3 ] 與 [ setStateActivity4 ] 兩個元件用的。
這兩個元件是負責連接到你在 [ 循序工作流程 ] 上的指定連接。可以想像成只要執行到這個元件就會很像觸動超連結一樣,跳到你指定的連接去!!!
在這邊我們如果是經由 WebService 啟動這個流程的話,到這邊要走左邊的路徑。反之,你是由網頁應用程式啟動的話。我們走右邊的路徑。為什麼
這樣安排呢? 其實很單純的只是因為 WebService 的 Output 元件被我們放再另外的一個 StateActivity 裡面了,所以我們要做這樣的設定以確保萬一是經由
WebService 啟動這個流程的話,WebService 能找到結束的對應。
在 [ codeActivity1 ]上點兩下,進入程式編輯區域。我們撰寫下方右圖這樣的簡單程式,來告知前端使用者。這個流程是被什麼樣的應用程式所啟動的
然後再到 [ IfActivity ] 元件裡面設定條件判斷式。
我們在條件屬性區域裡面的 [ Condition ] 選擇 [ 宣告式規則條件 ]。按下 [ ConditionName ]進入 選取條件的編輯視窗。
我們新增一個條件式,在裡面我們輸入 this._RequestMessage == "webservice" 來做判斷。假如你是由
WebService 的方式啟動網站的話,就會走到左邊的區塊。反之,
則是走到右邊的區塊。
設定完成我們到專案上按下 [ 建置 ],並且按下滑鼠右鍵選擇 [ 發行為 Web 服務 ]。將網站發行成為 Web Service !!!
運氣好的話會看到一切都建置成功!!! 這是 WWF 幫我們發行出來的WebService。
加入新網站來呼叫WWF。
我們加入一個新網站,網站名稱命名為 [ Lab12_ASPNet_Call_MultiStateMachine ]。
我們在 [ Default.aspx ] 裡面加入一個 Label 跟 一個 Button。
在網頁的部分我們在加入參考 3個 Workflow Foundation 所必要的元件,還有剛剛完成的WWF專案。
然後我們先作前置宣告,我們增加了五個新的項目。
我們新增一個方法為 workflowCompleted ,這個是要委派給工作流程結束事件時啟動的方法。
接下來我們在網頁上按鈕點兩下,輸入下方的程式碼。主要是用來啟動工作流程,然後傳入 "Web網頁啟動"。將值傳入進去。
並且取得回傳的值。
測試Web應用程式呼叫工作流程。
都輸入完成後~我們來測試結果。在 .net 網站專案上直接編譯執行。測試我們的網站呼叫工作流程!!
測試
WebService 呼叫工作流程。
在工作流程所發行的Web服務上,我們找到副檔名是 asmx 的檔案,然後按下滑鼠右鍵選擇 [ 在瀏覽器中檢視 ]。
接著我們來測試結果!! 記得在輸入的框框中我們要輸入 "webservice" 喔!! 還記得我們的工作流程有一個 [
ifActivity ]是用得到的字串來判斷是不是 WebService 呼叫。所以我們要在
輸入的框框中打上 "webservice" 喔!! 然後就可以看到回傳的結果了~^^y