[Develop]Lab11-MultiEventDriven

[Develop]Lab11-MultiEventDriven

Lab11 、MultiEventDriven

這個Lab中,我們要設定一個狀態機流程在初始的[ InitialstateActivity ]裡面可建立多個[ eventDriven
] 物件。每個[ eventDriven ] 都可實作一個 [ handleExternalEventActivity1 ]。這個範例

再說明一個狀態機工作流程是可以因為外部所觸發的事件來決定他要走哪條路。我們用下圖來解釋可能就會比較清楚 :

clip_image001

假設你現在幫客戶設計一個購物網站。內假設有 [ 商品網站 ]、[ 購物車 ]、[ 結帳 ] 三個模組。我們知道最終這個網站還是要有跟使用者可以互動的介面。

就是你設計很美觀的網頁畫面。流覽網頁的行為不是一個循序的行為。使用者一下要去看商品、一下要去看購物車裡面到底買了什麼、一下要去結帳。

而要去那一個頁面( 在這邊我們假設他是一個模組 )是根據使用者按下了那一個按鈕,所以我們要根據這個動作來判斷帶領使用者去那一個模組中。

所以你的網頁結構很可能是向下列這個圖形一樣的複雜。因為使用者的行為本來就很自由,你的網站要彈性的話,不太可能規定一個制式的行為路徑,不是嗎
?

clip_image002


開啟一個新的WWF專案。

這個範例中我們要使用的是 [ 狀態機工作流程程式庫 ] 。檔案名稱我們命名為 [ Lab11_EventDriven ] 。

clip_image003


加入介面。

首先我們在這個專案來加入介面;介面名稱為 [ Lab11_Interface1.cs ],在介面中我們輸入 [ Using System.Workflow.Activities
]。並且將介面標為本機服務介面 [ExternalDataExchange()] 。然後我們宣告4個事件。

event EventHandler<ExternalDataEventArgs> eventdriven1;

event EventHandler<ExternalDataEventArgs> eventdriven2;

event EventHandler<ExternalDataEventArgs> eventdriven3;

event EventHandler<ExternalDataEventArgs> eventdriven4;

介面傳輸類別我們宣告為<EventClass>。

clip_image004

clip_image005


設定狀態機流程內容。

我們在狀態機工作區域在新增一個 [ stateActivity1 ],然後在新增的[ stateActivity1 ] 上按下滑鼠右鍵,選擇
[ 設定為已完成狀態 ]。指定這個[ stateActivity1 ] 是一個結束的[ stateActivity1 ] 。

當狀態流程跳到這個[ stateActivity1 ] 時,流程就會結束。

clip_image006

clip_image007

clip_image008

在狀態機工作流程主區域裡面的 [ Workflow1InitialState ] 裡面新增4個 [ eventDriven ] 物件。然後將四個物件都拉一條線連接到
[ stateActivity1 ] 上面去。然後點進去每一個 [ eventDrivenActivity ],

在每個 [ eventDrivenActivity ] 裡面都拉出兩個元件 [ handleExternalEventActivity1
] 和 [ CodeActivity ]。

clip_image009

clip_image010

clip_image011

clip_image012

clip_image013

在[ eventDrivenActivity1 ] 裡面的 [ handleExternalEventActivity1 ] 的屬性的地方,我們做兩項設定。

1. InterfaceType = Lab11_EventDriven.Lab11_Interface1。

2. EventName = eventdriven1 。

clip_image014

clip_image015

在[ eventDrivenActivity2 ] 裡面的 [ handleExternalEventActivity2 ] 的屬性的地方,我們做兩項設定。

1. InterfaceType = Lab11_EventDriven.Lab11_Interface1。

2. EventName = eventdriven2 。

clip_image016

clip_image017

在[ eventDrivenActivity3 ] 裡面的 [ handleExternalEventActivity3 ] 的屬性的地方,我們做兩項設定。

1. InterfaceType = Lab11_EventDriven.Lab11_Interface1。

2. EventName = eventdriven3 。

clip_image018

clip_image019

在[ eventDrivenActivity4 ] 裡面的 [ handleExternalEventActivity4 ] 的屬性的地方,我們做兩項設定。

1. InterfaceType = Lab11_EventDriven.Lab11_Interface1。

2. EventName = eventdriven4 。

clip_image020

clip_image021

接著我們進到 [ 狀態機工作流程 ]程式編輯區塊裡面,我們宣告一個字傳變數 [ returnMessage ]。這個變數是用來跟前端應用程式溝通,因為這個變數被宣告為
[ Private ]。所以在下方宣告了一個 Set 跟 Get 的方法,

來提供前端應用程式存取。

clip_image022

在每一個 [ eventDrivenActivity ] 裡面的 [ CodeActivity ]點兩下。依序新增下列的程式碼。新增完畢後按下
[ 建置 ],來建立這個專案。

clip_image023


加入新網站。

接者我們加入一個新的 ASP.Net 網站,這個網站要用來呼叫剛剛建立好的 [ 狀態機工作流程 ]。

clip_image024

clip_image025

我們將剛剛建立 狀態機工作流程專案加入參考。

clip_image026

然後在網頁上我們拉出 4個 Button 按鈕 跟 一個 Label 。

這4個按扭分別要被對應到不同的狀態機工作流程中的 [ handleExternalEventActivity ],並且觸動 狀態機工作流程中的
[ eventDrivenActivity ] 去執行。

這樣做到底有什麼好處呢?? 試著去想假設你的

clip_image027

在網頁的部分我們在加入參考 3個 Workflow Foundation 所必要的元件。

然後我們先作前置宣告

using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;

using System.Threading;
using Lab11_EventDriven;

再來我們實作 [ Lab11_Interface1 ] 介面。

clip_image028

clip_image029

我們宣告一個叫做 Call 的方法,方法沒有回傳值,但是接受一個 String 的值帶入。方法除了啟動我們設計的狀態機工作流程外,裡面還有一個
Switch 判斷你帶入的 String 值。

當代入值為 "Event1" 的時候,我們會去呼叫Case "Event1" 去執行裡面的動作並且呼叫
狀態機工作流程。

clip_image030

接著我們宣告 4個Button 的 按扭事件;當4個按鈕被按下後。會去呼叫一個叫做 Call 的方法,並帶入參數值供 Call 方法判斷。

clip_image031


測試。

我們來測試結果。當你按下 不同的 Button的時候,Label標籤裡面的值都會跟著改變。

clip_image032