介紹如何使用 Windows Workflow Foundation 來處理自動進程與人工活動貫穿相交的這種常見業務方案。它為開發和執行基于復雜過程的多種應用程序提供了框架。典型示例包括文檔治理應用程序、企業對企業應用程序和企業對消費者應用程序。用戶可以使用 Visual Studio 2005 幫助設計基礎工作流以及有關的頂級應用程序和程序集。
可以使用 Windows 窗體應用程序來收集電話的相關輸入數據,并在數據庫中創建一個記錄:即包含時間、說明、狀態和唯一 ID 的票證。第二個 Windows 窗體應用程序的用戶將看到待處理申請的實時列表,然后選取一個申請。然后,接線員將盡量解決問題(回電給客戶、檢索申請的信息、發送電子郵件或執行一些遠程活動),并指明問題是已解決還是需要進一步研究。此決策可由一個命令性操作表示,例如單擊某個按鈕更新同一基礎數據庫中的票證。最后,假如還涉及其他類別的用戶,自定義前端將使這些用戶能夠指明問題已成功關閉或中止。
假如用戶具備由各活動組成的基于工作流的系統(如 Windows Workflow Foundation),則可利用命令性代碼和聲明性活動地圖的強大組合以及綁定它們的聲明性規則來實現應用程序。主要好處在于用戶可以為解決方案建模(甚至以直觀方式建模),將 Windows Workflow 嵌入運行時服務器來解釋圖表,并使 Windows Workflow 遵循在創建塊中定義的鏈接。進程越復雜,為其設計和實現的流程就越簡單。進程動態更改越輕易,用戶需要編寫和維護的代碼數量就越少。讓我們了解一下如何實現技術支持方案的 Windows Workflow Foundation 解決方案。
技術支持解決方案
通過創建票證,創建的技術支持工作流程即開始,然后在等待連接用戶或技術人員給予響應時停止。無論票證是關閉還是升級,工作流都將獲得外部事件,并更新應用程序的內部狀態以跟蹤該事件。因此,工作流需要與外界進行交互。這類異步活動是 Windows Workflow Foundation 解決的實際工作流進程的固有問題之一。因為需要與系統外部的實體進行交互,所以宿主應用程序和工作流可以定義約定,以進行任何必要的數據交換。此處顯示的 IHelpDeskService 接口說明了在工作流及其宿主之間建立的通信接口:
WorkflowPersistence 服務將序列化功能添加到在給定運行時引擎內執行的所有工作流實例。工作流服務核心功能由 WorkflowPersistenceService 類表示。Windows Workflow Foundation 通過 SqlWorkflowPersistenceService 實現它。此類可以將工作流數據保存到具有已知架構的 SQL Server 2000 或 SQL Server 2005 數據庫中。用戶可以使用許多腳本和基于對話框的實用程序輕松創建目標數據庫。可以從 Windows Workflow Foundation 網站 下載所需內容。必須創建 SQLWorkflowPersistenceService 的實例并向運行時注冊,才能實際啟動運行時。持久性服務的構造函數使用連接字符串作為其唯一的參數。
如前所述,運行時服務是整體 Windows Workflow Foundation 體系結構的可插入部分,因此用戶可以創建自己的服務,并使用自己的服務替換標準服務。 QQRead.com 推出數據恢復指南教程 數據恢復指南教程 數據恢復故障解析 常用數據恢復方案 硬盤數據恢復教程 數據保護方法 數據恢復軟件 專業數據恢復服務指南 恢復工作流實例
在所述方案中,需要由其他接線員(技術人員)接手任何開放的票證,并盡可能去解決它們或將它們提交給上一級。技術人員將使用其他應用程序,或者至少使用圖 4 中的應用程序的其他實例。在這兩種情況下,都必須通過持久性支持創建工作流運行時的其他實例,并且必須加載和恢復正確的工作流狀態。如您所見,只有在已經保存空閑工作流的 ID 的情況下才發生這種情況。在技術支持示例應用程序中,票證 ID 特意設置為與工作流 ID 相匹配,每個票證都對應于被創建用于處理票證的工作流的一個實例。
工作流完成時,將自動從 Windows Workflow Foundation 持久性數據庫中刪除。當工作流結束時,WorkflowCompleted 事件將激發。在技術支持方案中,工作流將在接線員單擊解決或升級之后完成(請參閱圖 6)。
從開發的角度而言,要害要注重以下兩點。第一,要將事件引發到工作流,必須將申請發布到池線程:
public void RaiseCloseTicketEvent(Guid instanceId) { ThreadPool.QueueUserWorkItem(JustCloseTheTicket, new HelpDeskTicketEventArgs(instanceId, "Jim")); }
public void JustCloseTheTicket(object o) { HelpDeskTicketEventArgs args = o as HelpDeskTicketEventArgs; if (TicketClosed != null) TicketClosed(null, args); } 第二,不能在主 Windows 窗體線程上引發 WorkflowCompleted 事件,因此不能直接更新任何 UI 控件。(這是由于 Windows 窗體控件不是線程安全控件。)確實可以在創建 Windows 窗體控件的線程之外的線程中更新 Windows 窗體控件,但是需要間接調用更新控件的方法:
Windows Workflow Foundation 使用戶可以直觀地設計復雜的算法,從而解決業務問題并為進程建模。工作流是用于說明數據和操作流的工具。因此,任何需要 IF 或 WHILE 語句的方案都可以是工作流。但是,任何人都不能使用僅包含 IF 語句的工作流,工作流運行時確實具有成本,該成本可以在流復雜性超出給定閾值時分攤。
基于工作流的解決方案的真正優點是使復雜進程更易于建模和實現,更重要的是使其更易于改進和擴展。Windows Workflow Foundation 為 Windows Workflow 程序提供了托管執行環境,還為程序提供了持續時間、可靠性、掛起/恢復以及補償特征。在某種意義上,活動類似于中間語言 (IL) 操作碼或程序語句,但包含特定領域的知識。簡而言之,Windows Workflow Foundation 使程序語義具有聲明性并且十分準確,使用戶能夠為接近實際進程的應用程序建模。它是最適合此工作的工具。用戶無需使用 IL 編寫前端可視應用程序,而是使用 RAD 開發工具和更具人類可讀性的語言。Windows Workflow Foundation SDK 提供了廣泛的編程語言,專門用于為復雜的業務程序建模,非凡是在這些程序可能隨著時間而改進的情況下。在這種情況下,主要好處在于用戶可以添加非凡活動來進行工作流,并使用內置行為活動來控制該工作流。用戶可以專注于任務,其他事情由運行時進行處理。