本文章是由機器翻譯。

基礎工作流 4.5

Windows Workflow Foundation 4.5 的新功能

Leon Welicki

下載代碼示例

去年 9 月生成會議 (buildwindows.com),微軟推出了 Windows 基礎工作流 (白表 4.5) 的下一個版本和可作為 Windows 8 的開發者預覽部分公眾的預覽 (msdn.microsoft.com/windows/apps/br229516)。在本文中,我會走通過添加到白表 4.5 中重要的新功能。給定的文章一般範圍和功能集的大小,每個討論將是短暫的但我希望你會激動下載 Windows 8 的開發者預覽並開始玩白表 4.5。

白表:昨天、 今天和明天

白表 4 從開發人員社區 2010 年運到一個很大的接待。白表 4 對其前身 (WF 3.5 英寸) 包括重大進展:改進的運行時、 更好的總體性能、 簡化的活動創作、 Windows 通訊基礎 (WCF) 的充分集成、 聲明性創作和大大簡化設計器變換的主機。2011 microsoft 帶來了一個功能全面的版本的狀態。NET 框架 4 平臺更新 1,具有相同的品質和支援可用今天保證作為任何其他元件的框架。白表 4.5,與我們的目標是解決我們瞭解我們的客戶從當前重大問題。我們還到雲 ; 採取的白表的所有電源工作 有一個巨大的生成介紹,你可以看看什麼團隊已達 (bit.ly/rbJROw)。

當您閱讀這篇文章,我相信你會有關于白表 4 和白表 4.5 之間的相容性問題。保證版本建立在相同的代碼基和完全相容。您所有的白表 4 投資將白表 4.5 保留,而不需要任何更改。

我們發貨白表 4 後,我們收到很多偉大的回饋,我們用來計畫的下一版本。白表 4.5,我們想解決您最關心的是,添加功能為建設工作流程應用程式提供最佳的框架。圖 1 客戶顯示請求和回應這些請求創建的功能。

圖 1 客戶請求和白表 4.5 的新功能

表按主題 ; 組織的通知 我將在即將舉行的各節中使用同一主題目前最重要的功能。

創作的改進

C# 運算式白表 4,您可以使用 Visual Basic 寫運算式,以及 Visual Studio 中使用時,運算式編輯器提供了您所料,如自動完成、 智慧感知,如此這般的所有語言服務。但我們白表 4 的客戶告訴我們他們也情願寫 C# 比 Visual Basic 中,因此我們添加對 C# 運算式的支援。現在,如果您創建 C# 專案您可以獲得 C# 運算式在您的工作流程中的情況。別擔心,不過。如果您創建 Visual Basic 專案,您仍然獲得了 Visual Basic 運算式。C# 支援還配有你所期望的所有的語言服務中所示圖 2。注意的智慧感知框中顯示第二個 C# 重載為字串。格式。


圖 2 C# 中工作流運算式

如果您想嘗試 C# 運算式,只是創建一個 C# 工作流專案。在這篇文章的同伴代碼中,也可以打開 CSharpExpressions 專案。

合同第一服務創作白表 4 帶來巨大的 WCF 集成。您可以創建 WCF 服務利用所有的白表能力 (長時間運行的執行、 持久狀態、 聲明性創作和執行的可見性) 而無需編寫一行代碼 (在看到"視覺設計的工作流與 WCF 和白表 4" msdn.microsoft.com/magazine/ff646977)。創作時白表 4 中的工作流服務,服務合同是從工作流定義推斷。當主機啟動時,消息傳遞活動,在尋找的工作流定義的散步,然後公開了相應的合同 (例如,每個接收活動轉換為一個服務操作)。

很多客戶說他們更喜歡他們的工作流服務創建現有 WCF 服務合同 (工作流是只是其中一種可能的實現合同的),因此在白表 4.5 我們添加用於創作"合同第一"的服務支援。現在可以導入 WCF 服務合同定義工作流專案中的,並使其中一個或多個工作流服務實施該合同。工作流服務創作的這種新方法不會替換工作流第一種方法。

合同第一白表中是一個兩步的過程:你在專案中添加對合同 (定期 WCF 服務合同) 的引用,然後在您的服務實現合同。

要導入合同,按右鍵該專案,請選擇"導入服務合同"功能表項目,然後選擇合同類型。一旦合同導入並生成專案時,一組代表每個操作的活動將添加到工具箱中,如中所示圖 3


圖 3 生成的活動被添加到工具箱

作為圖 4 所示,您可以添加接收和 SendReply 之間的活動。這些活動表示操作的身體。


圖 4 簡單的服務方法計算某個值的

第二步是以指示給定的服務實現合同。為此,您在設計器中打開工作流服務和 WorkflowService 根的 ImplementedContracts 集合中添加合同。

一旦實現了服務合同,設計器將運行一組新的驗證規則,以確保該服務榮譽合同。因此,您將看到警告和錯誤,如果合同沒有得到充分實施。

如果您要查看合同第一到同伴的代碼中的 ContractFirst 專案在行動中,看一看。實際操作的經驗請按照上一節中描述的步驟。

更有效地使用白表設計器 WF 可視設計器提供了您的工作流的圖形表示,使它們更易於創建和共用。設計器是白表的一個主要功能,是最常用的創作工具。白表 4.5,我們添加了高度請求的功能,使您能夠更高效的使用它。

批註中白表 4,唯一的地方,您可以添加到設計器中的文本是條的活動,而是一個活動的頂部的一行文本區域的顯示名稱。沒有其他方法將添加到您的工作流的非結構化的描述性資訊。但是,你想要能夠在您傳達不只是工作流定義 (例如,添加行為的進程步驟說明) 的活動設計器中添加注釋或文本。

白表 4.5 我們添加注釋,使您可以將文本的評論和描述添加到設計器中的活動。圖 5 顯示工作流與無注釋。請注意如何你現在可以向任何活動添加描述性資訊。帶批註,設計器的列印輸出可以充分表達該工作流在做什麼。


圖 5 工作流與無批註

您可以顯示注釋作為始終可見或粘滯便箋作為活動的顯示名稱欄中。

注釋是選擇不在功能和沒有執行時間的影響。他們是作為添加到工作流 XAML 檔附加屬性,如下麵的代碼片斷所示:

<Activity mc:Ignorable="sap2010" 
  x:Class="DesignerImprovements.Annotations" 
  xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:sap2010="https://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <Sequence sap2010:Annotation.AnnotationText="This is an example annotation">
    <WriteLine Text="Hello Dev11"/>
  </Sequence>
</Activity>

要查看操作中的注釋,請看看附加注釋專案在同伴的代碼。實踐的經驗,打開 WF 4.5 工作流專案、 添加到設計器中的活動和選擇活動的上下文功能表中的"添加注釋"。

加強流程圖和狀態設計師您要求我們提高方面的設計經驗,讓你更有成效,特別是要添加新的 activ­伊蒂埃斯流程圖或狀態 (可通過。淨框架平臺更新 1)。我們聽著。

我們添加自動連接,從而可以自動連接到一個現有的活動,在設計器中的一個新的活動。我們添加自動插入,允許您插入兩個現有的活動,通過新的活動放了連接線之間的活動。圖 6 顯示了這些功能。


圖 6 自動連接和自動插入

要嘗試這樣做,只需創建一個白表專案,並添加流程圖或狀態。當添加新的活動,你會發現滴 auto-connect 的目標。你已經連接兩個活動後,您可以通過它放了連接線添加第三個。

大工作流導航中白表 4,大於螢幕工作流時,您移動使用水準和垂直捲動條。你告訴我們,這種方式移動大型工作流是痛苦的限制了您的工作效率。

在 WF 4.5 我們添加平移,它允許通過設計器的畫布上使用滑鼠移動。您可以通過按一下設計器中的泛按鈕啟用平移模式。平移是作為一種通用的設計器功能,可用,因此您可以使用它與任何現有的活動。

要嘗試平移,打開任何工作流設計器中,按一下泛按鈕和享受俐落 !

白表 4.5 還提供了允許您直觀顯示您的工作流的文檔大綱的樹狀檢視。這為您提供您的工作流程,使您能夠更輕鬆地導航大型的工作流程非常簡潔和結構化視圖。當您按一下此視圖中的一個活動時,它選定在工作流定義中,如中所示圖 7


圖 7 文檔大綱視圖中的工作流

要嘗試此功能,打開工作流設計器中,轉到視圖功能表,選擇其他視窗和文檔大綱。

在設計器中搜索集成白表 4 中時,可以使用 Visual Studio 搜索使用白表設計器,但搜索結果不集成在一起,白表設計器。按一下搜索結果不會把您帶到工作流中的特定位置。你清楚這將如何影響您的工作效率,並為我們提供這種能力是何等重要。

在 WF 4.5 我們與 Visual Studio 搜索集成白表設計器。現在點擊搜索結果將帶你到活動在工作流中,即使它嵌套了走了幾個級別。

試試這個,創建工作流專案並開始編輯工作流設計器中。添加一些活動並配置它們的屬性。現在,搜索使用 Visual Studio 的搜索關鍵字。搜索結果應以你的匹配關鍵字的活動。

用序列自動環繞白表 4 活動模型支援組成,在其核心 ; 可以組成的活動,不受限制。例如,Body 屬性一段時間的活動可以是一個序列、 平行、 流程圖、 狀態、 WriteLine、 延遲或其他任何現有的活動。複合活動往往接受 (一組),而不是只是一個活動,可以是任何其他葉或複合活動的 Body 屬性。

更常見的身體活動之一是序列,尤其是與控制流活動喜歡在 ForEach 同時,等等。有了這些,如果您添加一個孩子,然後更改你的思想對序列的元素,有利則需要削減兒童在正文中,然後添加到主體的序列和粘貼兒童。這是乏味而且容易出錯。

白表 4.5,我們添加了一個"用序列自動包圍"功能。例如,如果你有一段時間,除去另一項活動時,其主體就是 WriteLine,其中包含現有的活動和新的序列自動創建,如中所示圖 8


用序列圖 8 汽車環繞聲

要嘗試這樣做,請按照中的步驟圖 8

生成集成中白表 4 可以在設計器中以聲明方式創建新的活動。當您這樣做時,實際上您定義一種新的類型,將放置在編譯專案時生成的程式集。但是,如果您生成一個白表 4 專案和 XAML 中有錯誤,生成仍成功雖然中生成的程式集不包括您的工作流。

白表 4.5 我們固定的這個問題。如果您生成錯誤的工作流,生成將中斷,如您所料。

若要實現此解決方案,我們添加擴展性到 XamlBuildTask 以便在 XAML 活動,編譯過程中可以訪問它中斷生成,當 XAML 工作流檔有錯誤。

要嘗試此功能,創建一個新的白表應用程式和工作流中添加錯誤配置的活動。你將生成錯誤。您也可以嘗試在同伴的代碼中的 ErrorBreaksTheBuild 專案。

狀態機框出的狀態是一種非常重要的控制流活動,沒有用白表 4。關於這次活動,所以現在狀態的重要性的回饋帶來的噸是白表 4 中可用的安裝之後。NET 框架產品更新 1。白表 4.5,您不需要安裝任何更新可利用的狀態 — — 它包括外框的右側。

要嘗試此功能,創建一個工作流專案和添加狀態活動或只是在這篇文章的同伴代碼中打開狀態示例專案。

版本控制支援

白表 4 不包括對工作流的版本控制支援。如果你想要的版本控制,您不得不寫一切對你自己的常常打很難解決的問題。白表 4.5 包括啟用版本控制的新功能。

WorkflowIdentity 中白表 4 中的主機是負責定義和實例之間的關聯。一旦實例已被保留,從記憶體中卸載,主機必須提供的正確定義來繼續的實例的執行。一個大的挑戰就是沒有保持的實例狀態,可以説明確定哪些定義用於創建該實例的主機資訊。此外,如果主機配置錯誤定義載入一個實例時,使用者會得到一個尷尬的異常,因為錯誤是不能匹配定義,而不是真正的版本不匹配的實例狀態的副作用。

白表 4.5 引入了 WorkflowIdentity,一種新的類型,是指完全配置工作流定義並是實例的運行時狀態的一部分。WorkflowIdentity 包含一個名稱 (字串)、 一個版本 (System.Version) 和包 (字串)。名稱和版本一目了然 ; 包是一個可選的字串,用於消除歧義。指的是工作流定義 (程式集名稱、 服務 URI 或您選擇的任何字串) 的容器。WorkflowIdentity 是所有白表版本控制功能的基石。

WorkflowIdentity 的最有用的特點之一是它是工作流實例狀態的一部分,並住在一個活動的整個生命週期:它在持久性期間保存,可以從實例存儲查詢併發出與工作流實例的跟蹤資訊。

使用 WorkflowIdentity 是容易的。以下程式碼片段顯示了如何使用它的 WorkflowApplication,我們單實例、 單定義、 過程中的主機 (你只需要將 WorkflowIdentity 的實例傳遞到構造函數的 WorkflowApplication):

WorkflowIdentity identity = new WorkflowIdentity("Sample", new Version(1, 0, 0, 0),
  "MyPackage");
WorkflowApplication application = new WorkflowApplication(new MyActivity(), identityV1);

我們只是工作流配置 WorkflowApplication­的身份,但我們還沒有尚未做任何有用的東西。 下一個代碼示例演示如何使用身份來檢測版本不匹配,並提供一個可操作的錯誤消息。 版本不匹配時嘗試載入一個實例,事件中,您將獲得 VersionMismatchException,指出問題的原因,並包含提供的和預期的身份。 此資訊可以用於日誌記錄或從錯誤中恢復:

try
{                
  WorkflowIdentity wrongIdentity = new WorkflowIdentity("Sample", new Version(2, 0, 0, 0), 
    "MyPackage");

  WorkflowApplication application = new WorkflowApplication(new WrongActivity(), 
    identityV2);

  application.Load(instanceId);
}
catch (VersionMismatchException ex)
{
  Console.WriteLine("Version Mismatch!
{0}", ex.Message); 
  Console.WriteLine("Expected: {0}; Provided: {1}", ex.ExpectedVersion, ex.ActualVersion); 

}

最後,您可以從實例存儲區載入它之前瞭解給定的工作流實例的身份。要查詢身份,您需要獲取的 WorkflowApplicationInstance,表示實例已與定義相關聯的白表 4.5 中引入新的類型。它用於檢索有關該實例的中繼資料 — — 在此情況下,身份。請參閱 bit.ly/ssAYDn 的詳細資訊。

注意 WorkflowIdentity 有效不僅與 WorkflowApplication,也與 WorkflowServiceHost。

如果您想嘗試此功能,請打開的 WorkflowIdentity 專案同伴的代碼中。

WorkflowServiceHost WorkflowServiceHost (WFSH) 是在白表 4 中提供的工作流出的框、 單-定義的多個實例主機。然而,一個不幸的白表 4 限制是執行更改工作流定義結果異常如果您嘗試載入以前保持的實例到 WFSH。這是因為主機是無法運行這些實例使用新的定義 (這是我們在 WorkflowIdentity 節中指出的問題)。一些客戶工作圍繞缺乏在白表 4 中使用多個 WFSHs 和路由 WCF 服務用戶端應用程式和工作流之間的仲介作為內置版本控制支援。用戶端發送郵件的路由器,將郵件路由到相應的 WFSH 使用正確的版本定義的配置。缺點是這需要版本知道成功地將消息發送到服務實例的用戶端應用程式。

在 WF 4.5,WFSH 已經成為多版本的主機 ; 您可以部署工作流服務相同的 WFSH 內的多個版本,它會將傳入郵件傳遞到正確的版本。

語義是很簡單的:新實例啟動與最新版本的服務,並運行的實例繼續執行與用來啟動他們的版本。有一些限制上什麼你可以從一個版本的變化 ; 您不能刪除服務操作 (獲得),但您可以添加新的 (規則是類似于在 CLR 中創建派生的介面)。

此功能的關鍵啟用碼是 WorkflowIdentity。要確定您需要配置其身份的服務定義的版本。服務的舊版本必須放在一個"受支援的版本"的資料夾,是具有相同的名稱作為工作流服務在 App_Code 資料夾中 (請參閱圖 9)。或者,舊版本還可以載入明確到 WorkflowServiceHost 通過添加到 SupportedVersions 集合之前,打開主機。


圖 9 WorkflowServiceHost-並行版本控制

使用這個新功能,不再需要路由器,和用戶端應用程式不必版本注意。他們只是發送一條消息 ; 通常的關聯機制將其解析為正確的實例和主機將使用相應的定義 (因為保持的實例狀態包含定義需要載入它的身份)。XCopy 部署語義會保留,因此您不需要寫一行代碼來使用它。此功能也是自託管方案 (在您自己的應用程式中的託管 WFSH) 中可用。

要嘗試此功能,請打開 WFSH_SxS 專案同伴的代碼中。

動態更新白表 4,一旦開始工作流實例,在沒有受支援的方法更改定義的工作流。這往往是一個問題,當程式需要更新,由於對 bug 修復或不斷變化的需求。

企業客戶都強調這種能力的重要性,因為他們經常需要更改特定工作流實例在長時間運行的工作流。例如,假設的工作流模型的面試過程,有四個面試官,但,鑒於新的公司政策,現在需要改變添加第五次的面試官。你不能那樣做白表 4。

您可以在白表 4.5。動態更新允許您更改以適應新的工作流定義工作流的運行實例。這種變化可能會遺漏的動機,在設計時,錯誤的工作流程,或者新的要求。動態更新並不被針對需要批發的變化的情況導致顯著區別其原始設計的工作流。在那種情況下,您應該設計,而不是在運行中的實例更改新工作的流。

動態更新通常是一個兩步的過程:當更改工作流定義,您還需要創建一個更新映射:結構,包含有關更改的資訊。當部署新的版本時,地圖可以用於更新運行的實例的新定義。只有當他們空閒和持久化,可以更新正在運行的實例。

動態更新,可用在 WorkflowApplication 和 WorkflowServiceHost,是高級、 複雜的功能,它具有更多的功能,比我提到過。它支援更新活動,提供自訂更新語義,發光的跟蹤資訊,和更多。它為您提供了一個豐富的 API,您可以在應用程式中使用為您運行的實例提供更新功能。

運行時的增強功能

我想簡要介紹一些運行時功能增強,在白表 4.5.Due 空間的限制,我不會深入他們與其他功能 ; 相同級別的詳細資訊 這些都是更確定範圍,先進的。

部分信任白表 4 規定執行的完全信任。白表 4.5 可以運行在部分受信任的 AppDomains。

運算式可擴展性我們修改 ExpressionTextBox 來綁定到的物件,而不是字串。因此,您可以提供自己編輯經驗的運算式和你不限於的文本表示形式。我們也暴露了快速路徑功能,可以與活動代碼用於創作表達活動具有更好的性能。

Visual Basic 性能增強我們大大改進的 VisualBasicValue/VisualBasicReference 性能通過更改其內部的實現。

白表 3 廢棄白表 3 類型已標記為過時在白表 4.5 的程式集。

接近尾聲了

我們花了白表 4,基於您的回饋意見,讓它更好。我們添加了多要求的功能和固定的一些關鍵問題,為您提供最佳的工作流框架,為你。網路應用。

白表 4.5 是就地替換為白表 4,是與白表 4 完全相容。我們徹底測試白表 4.5 不打破任何白表 4 方案 ; 您所有的白表 4 投資將完全保留在白表 4.5,無需任何更改。

如果您編寫的應用程式白表 4,保持這樣做 !當您準備將移動到白表 4.5 時,只是您的代碼,並且您和您的客戶將能夠利用並享受這篇文章中所述的所有改善措施。

Leon Welicki 是專注的白表的程式設計模型和運行庫在 WF 團隊的高級專案經理

多虧了以下技術專家,檢討這篇文章: Joe Clancy, Dave Cliffe, Dan Glick, Hani Khoshdel NikkhooIsaac Yuen