Workflow Foundation 4 第二課 - Hello WF 4

原文出處:http://michaelchpeng.spaces.live.com/blog/cns!37633C3B61B57B57!1145.entry


接下來我們就建立一個簡單的 WF 應用程式,感受一下它的變化。最簡單的例子當然不外乎一個 Hello 程式。如果你接觸過 WF 3,應該瞭解若是我們只是要輸出一段訊息到文字主控台,就是安排一個 Code Activity (為了我打字方便,就把 Activity 翻譯成活動控制項),然後寫一段程式碼:Console.WriteLine…。到了 WF 4,如同前一堂提到的,Code 活動控制項已經不在了,所以怎麼辦呢?讓我們來看看。

首先我們在 VS 2010 (目前是 Beta 2 的版本) 中建立一個 Workflow 專案,我選擇的是 Console Workflow Application 範本,我指定了解決方案名稱為 HelloWF4,專案名稱也是 WF4。我使用的是 Visual Basic,後面使用的例子也是 Visual Basic。如果你使用的是 C#,建議你可以直接下載 Visual Studio 2010 Beta 2 訓練教材 (https://go.microsoft.com/?linkid=9665216),參考其中的程式碼。

新的專案中會有一個預設的工作流程檔案 Workflow1.xaml,我把名稱改為 SayHello.xaml。注意到,單純的改變檔案名稱並不會更動流程類別的名稱,像下圖中可以看到,屬性視窗的檔案名稱是更改了,但是流程設計器左上方的工作流程類別名稱仍然是 Workflow1。要更改工作流程類別的名稱,請點選流程設計器的表面,屬性視窗會切換成類別屬性,這時再改變 Name 屬性的值為 SayHello,而設計器左上方的名稱也會隨之更動。

更改流程名稱

對於一個主控台應用程式而言,勢必有一個進入點。在我們的例子中是 Module1.vb (C# 就是 Program.cs),它的主程式 Main 中會載入這個工作流程執行。不過由於我們更改了名稱,自然也必須做對應的調整。所以我們可以開啟這個檔案,會看到如下圖的程式碼:

這裡我們又看到一個和之前 WF 3 不一樣的地方,載入和啟動流程的方式變簡單了。透過一個簡單的 WorkflowInvoker 類別所提供的 Invoke 方法,我們就可以載入工作流程並且執行。這個類別定義在 System.Activities 命名空間中。目前宣告載入的還是舊的 Workflow1,我們必須更改為 SayHello。你會發現程式碼編輯器還是指出它有錯誤,這是因為 XAML 檔在還未編譯的情況下,並沒有產生該類別的定義。所以我們可以按下 Ctrl+Shift+B 或是從 Build 選單中選擇 Build Solution 命令,建置整個解決方案。這樣就完成初步的更名動作。

在我們進入到流程設計之前,我們先留意左方工具箱的內容。WF4 內建的活動控制項分成幾大類,如果我們展開 Control Flow 類別,會看到其中一個 Sequence 活動控制項,它就是在 WF 3 中的循序工作流程。在 WF 4 中它被視為一個單純的容器控制項 (事實上它之前就是容器控制項),如果我們要安排的是循序流程,只要把它拖放到設計器表面,然後在它的裡面去安排作業流程,如下圖:

Sequence 工作流程

和 WF 3 的流程設計畫面相較,它有很明顯的不同,完全看不到流程線,而是透過結構的方式去展現它的流向。這是一個 WPF 設計器的畫面,隨著我們例子的發展,你可以逐漸感受到這樣的設計便利之處。我個人的看法,這個安排對熟悉流程圖的一般人而言可能不是很直覺,但是對於開發人員而言卻是相對容易理解的。但這是對很明確的循序作業是如此,如果我們要安排的是像一般流程圖那種作業呢 (也就是不一定在那裡結束,視程式邏輯推展的結果)?這就帶出了 WF 4 中一個新的流程類型:Flowchart。你可以在工具箱中看到一個 Flowchart 類別,其中有一個 Flowchart 活動控制項,它也是容器控制項。把它拖放到設計表面,就會出現一個 Start 節點。在這裡拖放進其他拖放控制項,是可以用線條連接決定流程走向的。當滑鼠滑過某個活動控制項時,週邊就會出現突點,只要直接拖放突點往目的活動控制項,就可以拖放出線條。下面就是一個流程圖工作流程的例子。

Flowchart 工作流程

這個 Flowcahrt 活動控制項取代了之前的 State Machine 流程類型,我的感覺是它要比 State Machine 容易瞭解。坦白講,不是資訊或電子本科系的人,恐怕很難理解 State Machine。Flowchart 相對要實用的多了,如果我們能以既有的流程控制活動控制項為基礎,再把我們的單元作業邏輯包裝成自訂活動控制項,那就可以很容易的利用 Flowchart 活動控制項建立各種複雜的流程。

如果我們檢視一下工具箱,會發現多了很多的活動控制項,特別是在資料的操作和流程的控制上。像是群集 (collection) 的操作,對泛用型別 (Generic) 的支援等等,都是因應不再有 Code 活動控制項後,能更容易的進行資料操作。

回到我們的例子,我們要透過文字主控台顯示一段固定的訊息,在工具箱的 Primitives 類別中有一個 WriteLine 活動控制項,它可以把我們指定的值輸出到主控台中。目前我們的流程只有一個步驟要執行,所以可以將這個控制項直接拖放到設計器中。檢視一下屬性視窗,會看到這個活動控制項有三個屬性,第一個是 DisplayName 的屬性。它可以讓我們以清楚的文字說明這個活動的作用,在這裡我填入 Say Hello to WF 4,它會反映在控制項的標題中:

除此之外外還有一個 Text 屬性和 TextWriter 屬性,前者可以讓我們指定要輸出的文字,它可以是一個 VB 的運算式 (真的,在 WF 4 中運算式的撰寫是以 VB 的語法為主,太意外了)。後者則可以讓我們指定一個 TextWriter 型別的串流類別,將串流中的文字輸出到主控台中。一旦把 WriteLine 控制項放到 Sequence 控制項內,你會看到控制項中有一個 Text 欄位,我們可以直接填入要顯示的文字內容,它就對應到 Text 屬性。這個設計比之前的做法要好太多了,又直覺,又方便。我在文字方塊中輸入了 "Hello Workflow Foundation 4",注意到,這裡要兩邊要加上雙引號,代表字串。

如果你是透過屬性視窗去指定運算式,它會出現一個運算式編輯視窗,而且還支援 IntelliSense,讚吧!

好啦,我們可以試著執行這個工作流程了。按下 Ctrl+F5,我們在非偵錯模式下執行,會得到如下的結果:

到這裡,我們做的事都不稀奇。我們可以同樣用一個標準的主控台應用程式,加上一行 Console.WriteLine 達成完全一樣的效果。但是我們可以看到,相較於 WF 3.x,它的作業要簡潔的太多了。而且如同我在第一課中所提的,如果只是像這樣純粹的作業邏輯,不是 WF 要介入的部份,WF 的價值是在作業流程的控制和作業生命週期的管理等更高的層次上。不過,至少我們有一個感覺,就是好像 WF 4 中的開發沒有那麼複雜,而且直覺的很。後面我們會看到更複雜的流程,下一課我們就看看如何建立一個自訂的活動控制項進行同樣的工作,而且能結合參數處理變動的狀況。