找了3個關於ASP.NET下運行WF的執行個體,並且都在自己的電腦上運行成功。其中兩個是在網上找到,地址分別是:
WF (Windows Workflow Foundation) 工作流程學習(一)一個Asp.Net狀態機器驗證程式和
WF (Windows Workflow Foundation) 工作流程學習(二)一個Asp.Net與順序工作流程結合的例子
這個兩個例子分別介紹了如何使用狀態機器工作流程和順序工作流程在asp.net下運行。兩個執行個體都非常簡單。並沒有講的太深,不過通過這個例子我們知道wf和asp.net是可以結合的,這是我們繼續研究下去的動力。
第三個例子是從書上找到的,書名叫做《windows workflow foundation 新一代工作流程開發事務》,在這本書的8.3節有一個結合ASP.NET應用程式開發WF的例子。(其實這個項目就是將WF官方提供的WF應用程式執行個體"OrderingStateMachine”修改了一下。WF代碼執行個體可以從:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a-d8ad115a8792&displaylang=en下載)我已經在自己的電腦上跑通,上面有一個比較好的地方就是能夠通過WF來控制頁面跳轉。如下面四張圖所示。
這是一個會員續約申請的工作流程執行個體。開始工作流程狀態是“等待會員輸入狀態”,在圖1中輸入會員編號,然後點擊“啟動申請流程”,然後工作流程會跳轉到圖2,在圖2中點擊“處理申請流程”以後工作流程又會跳轉到圖3的狀態。在圖3中點擊“申請完成回複”,工作流程結束,這是會跳轉到ProgessComplete.aspx頁面。前面圖1-3都是Default.aspx頁面,圖4跳轉到了新頁面,而這個跳轉是工作流程控制的。
圖1
圖2
圖3
圖4
1. 第三個案例項目整體架構
首先解釋項目結構,結構如所示:
圖 1
從中我們可以看到整個解決方案有兩個項目組成,一個是ASP.NET Web應用程式WebApplication1,另一個是工作流程類庫WorkflowLibrary1。WebApplication1是項目的前台介面,它也作為工作流程的宿主應用程式,因此我們會在WebApplication1中引用工作流程類庫WorkflowLibrary1。如所示:
圖 2
2. 工作流程類庫WorkflowLibrary1分析
本案例是一個審批次程序應用程式,一共分為四個狀態,分別是:等待會員輸入狀態,啟動申請單,申請單處理中和申請處理完畢。如所示。
圖 3
在狀態中添加EventDriven控制項,如的PRCreatedEvent,然後在EventDriven中添加需要觸發的外來事件HandelExternalEventActivity活動,如所示:
圖 4
如所示,HandelExternalEventActivity1執行完以後,工作流程會自動執行setStateActivity1,也就是變更工作流程狀態,將工作流程狀態從“等待會員輸入狀態”轉移到“啟動申請單”。這是由工作流程狀態之間的連線決定的。
每個HandelExternalEventActivity活動都需要配置其事件名EventName和介面類型InterfaceType。如所示:
圖 5
而這些都在定義在IProgressService中,IProgressService相當於是定義一個契約,用它描述引入的事件與類型。比如在IProgressService中建立了工作流程資料事件參數類OrderEventArgs,它繼承自外部資料事件參數類:ExternalDataEventArgs;然後再建立一個工作流程資料通訊介面IProgressService,在其中定義了事件OrderCreated。
我們定義了一個契約,一個事件的參數類,以及為了工作流程能夠接收事件所需要的所有中繼資料。接下來就是需要講到服務實現,服務實現寫在ProgressService中,類ProgressService實現了IProgressService介面,在實現中定義了觸發事件的處理過程。如方法:
public void RaiseProgressCreatedEvent(string orderId, Guid instanceId){}
3. WebApplication1宿主應用程式分析
WebApplication1是宿主應用程式,用於調用工作流程類庫。本執行個體中Default.aspx是展示層的首頁,在Default.aspx.cs中定義了工作流程執行邏輯。
首先,我們需要將ExternalDataExchangeService加入到運行時(WorkflowRuntime)中。ExternalDataExchangeService管理宿主的本地通訊服務,在IProgressService中有如下定義:
[ExternalDataExchange]
public interface IProgressService
上面的[ExternalDataExchange]就是表示定義了本地的通訊服務。
ManualWorkflowSchedulerService類提供一個線程服務,該服務允許建立工作流程執行個體的宿主應用程式指定用於運行工作流程執行個體的 Thread。 這是為了考慮多使用者調用工作流程執行個體的情況,我們只需要知道可以通過這個類的對象啟動工作流程執行個體即可。
ExternalDataExchangeService 類表示一個必須添加到工作流程運行時引擎才能啟用本地服務通訊的服務。若要正確地初始化和註冊這些服務,必需將本地服務實現添加到 ExternalDataExchangeService。我們的本地服務是ProgressService,因此在程式中會將ProgressService添加到ExternalDataExchangeService中,而ExternalDataExchangeService會添加到WorkflowRuntime中
ExternalDataExchange和ExternalDataExchangeService是配對使用的。只有定義了只有被標註為[ExternalDataExchange]的本地服務才能被添加到ExternalDataExchangeService中