在 .NET Framework 4 工作流程中使用 Interop 活動
本主題僅適用於 Windows Workflow Foundation 4。
使用 .NET Framework 3.0 或 .NET Framework 3.5 建立的活動,可以經由使用 Interop 活動,在 .NET Framework 4 工作流程中使用。 本主題提供使用 Interop 活動的概觀。
![]() |
---|
Interop 活動不會出現在工作流程設計工具的工具箱中,除非工作流程的專案已將其 [目標 Framework] 的設定值設為 [.Net Framework 4]。 |
在 .NET Framework 4 Workflows 中使用 Interop 活動
在本主題中,會建立一個 .NET Framework 3.5 活動程式庫,其中包含 DiscountCalculator
活動。 DiscountCalculator
會根據購買金額計算折扣,並且由包含 PolicyActivity 的 SequenceActivity 組成。
![]() |
---|
在本主題中建立的 .NET Framework 3.5 活動會使用 PolicyActivity 實作活動的邏輯。 不需使用自訂的 .NET Framework 3.5 活動或 Interop 活動,即可在 .NET Framework 4 工作流程中使用規則。 如需在 .NET Framework 4 工作流程中使用規則而不使用 Interop 活動的範例,請參閱 .NET Framework 4 中的原則活動 範例。 |
若要建立 .NET Framework 3.5 活動程式庫專案
開啟 Visual Studio 2010 並選取 [新增],然後選取 [檔案] 功能表中的 [專案]。
展開 [已安裝的範本] 窗格中的 [其他專案類型] 節點,並選取 [Visual Studio 方案]。
選取 [Visual Studio 方案] 清單中的 [空白方案]。 在 [名稱] 方塊中輸入 PolicyInteropDemo,然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropDemo],並選取 [加入] 和 [新增專案]。
提示:
如果看不到 [方案總管] 視窗,請選取 [檢視] 功能表上的 [方案總管]。 依序選取 [已安裝的範本] 清單中的 [Visual C#] 和 [工作流程]。 選取 .NET Framework 版本下拉式清單中的 [.NET Framework 3.5],然後選取 [範本] 清單中的 [工作流程活動程式庫]。
在 [名稱] 方塊中輸入 PolicyActivityLibrary,然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [Activity1.cs],並選取 [刪除]。 按一下 [確定] 以繼續。
若要建立 DiscountCalculator 活動
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyActivityLibrary],然後依序選取 [加入] 和 [活動]。
選取 [Visual C# 項目] 清單中的 [活動 (程式碼分開置放)]。 在 [名稱] 方塊中輸入 DiscountCalculator,然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [DiscountCalculator.xoml],然後選取 [檢視程式碼]。
將下列三個屬性加入至
DiscountCalculator
類別。public partial class DiscountCalculator : SequenceActivity { public double Subtotal { get; set; } public double DiscountPercent { get; set; } public double Total { get; set; } }
以滑鼠右鍵按一下 [方案總管] 中的 [DiscountCalculator.xoml],然後選取 [檢視設計工具]。
從 [工具箱] 的 [Windows Workflow v3.0] 區段,將 [原則] 活動拖放至 [DiscountCalculator] 活動中。
提示:
如果看不到 [工具箱],請從 [檢視] 功能表中選擇 [工具箱]。
若要設定規則
如果尚未選取新加入的 [原則] 活動,請在該活動上按一下加以選取。
按一下 [屬性] 視窗中的 [RuleSetReference] 屬性加以選取,然後按一下屬性右邊的省略符號按鈕。
提示:
如果看不到 [屬性] 視窗,請選擇 [檢視] 功能表上的 [屬性視窗]。 選取 [新增]。
按一下 [加入規則]。
在 [條件] 方塊中輸入下列運算式。
this.Subtotal >= 50 && this.Subtotal < 100
在 [Then 動作] 方塊中輸入下列運算式。
this.DiscountPercent = 0.075
按一下 [加入規則]。
在 [條件] 方塊中輸入下列運算式。
this.Subtotal >= 100
在 [Then 動作] 方塊中輸入下列運算式。
this.DiscountPercent = 0.15
按一下 [加入規則]。
在 [條件] 方塊中輸入下列運算式。
this.DiscountPercent > 0
在 [Then 動作] 方塊中輸入下列運算式。
this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
在 [Else 動作] 方塊中輸入下列運算式。
this.Total = this.Subtotal
按一下 [確定],關閉 [規則集編輯器] 對話方塊。
確定已在 [名稱] 清單中選取新建立的 RuleSet,然後按一下 [確定]。
按下 F6 以建置方案。
下列程式碼範例顯示在本程序中加入至 DiscountCalculator
活動的規則。
Rule1: IF this.Subtotal >= 50 && this.Subtotal < 100
THEN this.DiscountPercent = 0.075
Rule2: IF this. Subtotal >= 100
THEN this.DiscountPercent = 0.15
Rule3: IF this.DiscountPercent > 0
THEN this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
ELSE this.Total = this.Subtotal
執行 PolicyActivity 時,這三個規則會評估並修改 DiscountCalculator
活動的 Subtotal
、DiscountPercent
及 Total
屬性值,以計算所需的折扣。
搭配使用 DiscountCalculator 活動與 Interop 活動
若要在 .NET Framework 4 工作流程內使用 DiscountCalculator
活動,需使用 Interop 活動。 本節中會建立兩個工作流程 (其中一個使用程式碼,另一個使用工作流程設計工具),示範如何搭配使用 Interop 活動與 DiscountCalculator
活動。 兩個工作流程會使用同樣的主應用程式。
若要建立主應用程式
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropDemo],並選取 [加入] 和 [新增專案]。
確定選取 .NET Framework 版本下拉式清單中的 [.NET Framework 4],然後選取 [Visual C# 項目] 清單中的 [工作流程主控台應用程式]。
在 [名稱] 方塊中輸入 PolicyInteropHost,然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],然後選取 [屬性]。
在 [目標 Framework] 下拉式清單中,將選取項目從 [.NET Framework 4 Client Profile] 變更為 [.NET Framework 4]。 按一下 [是] 確認。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入參考]。
選取 [專案] 索引標籤中的 [PolicyActivityLibrary],然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入參考]。
選取 [.NET] 索引標籤中的 [System.Workflow.Activities]、[System.Workflow.ComponentModel] 和 [System.Workflow.Runtime],然後按一下 [確定]。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [設定為啟始專案]。
按下 F6 以建置方案。
在程式碼中使用 Interop 活動
在此範例中,會使用包含 Interop 活動和 DiscountCalculator
活動的程式碼建立工作流程定義。 使用 WorkflowInvoker 叫用這個工作流程,使用 WriteLine 活動則會將規則評估的結果寫入至主控台。
若要在程式碼中使用 Interop 活動
以滑鼠右鍵按一下 [方案總管] 中的 [Program.cs],然後選取 [檢視程式碼]。
將下列
using
陳述式加入至檔案最上方。using PolicyActivityLibrary;
移除
Main
方法的內容,並以下列程式碼取代。static void Main(string[] args) { CalculateDiscountUsingCodeWorkflow(); }
在名為
CalculateDiscountUsingCodeWorkflow
的Program
類別中建立新方法,其中包含下列程式碼。static void CalculateDiscountUsingCodeWorkflow() { Variable<double> Subtotal = new Variable<double> { Default = 75.99, Name = "Subtotal" }; Variable<double> DiscountPercent = new Variable<double> { Name = "DiscountPercent" }; Variable<double> Total = new Variable<double> { Name = "Total" }; Activity wf = new Sequence { Variables = { Subtotal, DiscountPercent, Total }, Activities = { new Interop { ActivityType = typeof(DiscountCalculator), ActivityProperties = { { "Subtotal", new InArgument<double>(Subtotal) }, { "DiscountPercentOut", new OutArgument<double>(DiscountPercent) }, { "TotalOut", new OutArgument<double>(Total) } } }, new WriteLine { Text = new InArgument<string>(env => string.Format("Subtotal: {0:C}, Discount {1}%, Total {2:C}", Subtotal.Get(env), DiscountPercent.Get(env) * 100, Total.Get(env))) } } }; WorkflowInvoker.Invoke(wf); }
注意:
DiscountCalculator
活動的Subtotal
、DiscountPercent
和Total
屬性會以 Interop 活動的引數顯示,並且繫結於 Interop 活動之 ActivityProperties 集合中的區域工作流程變數。Subtotal
會加入做為 In 引數,因為Subtotal
資料會流入 Interop 活動,而DiscountPercent
和Total
則會加入做為 Out 引數,因為其資料會流出 Interop 活動。 請注意,兩個 Out 引數是以DiscountPercentOut
和TotalOut
這兩個名稱加入,表示它們代表 Out 引數。DiscountCalculator
型別會指定為 Interop 活動的 ActivityType。按 CTRL+F5 建置並執行應用程式。 將
Subtotal
的值替換成不同的值,測試出DiscountCalculator
活動所提供的不同折扣層級。Variable<double> Subtotal = new Variable<double> { Default = 75.99, // Change this value. Name = "Subtotal" };
在工作流程設計工具中使用 Interop 活動
在這個範例中,會使用工作流程設計工具建立工作流程。 這個工作流程與上一個範例中的工作流程具有相同的功能,但不會使用 WriteLine 活動顯示折扣,而是由主應用程式在工作流程完成時擷取並顯示折扣資訊。 同時,這個工作流程不使用區域工作流程變數來包含資料,而是在工作流程設計工具中建立引數,並在叫用工作流程時從主機傳入值。
若要使用工作流程設計工具建立的工作流程裝載 PolicyActivity
在 [方案總管] 中,以滑鼠右鍵按一下 [Workflow1.xaml],再選取 [刪除]。 按一下 [確定] 以繼續。
以滑鼠右鍵按一下 [方案總管] 中的 [PolicyInteropHost],並選取 [加入]、[新增項目]。
展開 [Visual C# 項目] 節點,並選取 [工作流程]。 選取 [Visual C# 項目] 清單中的 [活動]。
在 [名稱] 方塊中,輸入 DiscountWorkflow,並按一下 [加入]。
按一下工作流程設計工具左下角的 [引數] 按鈕,顯示 [引數] 窗格。
按一下 [建立引數]。
在 [名稱] 方塊中輸入 Subtotal,選取 [方向] 下拉式清單中的 [In],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。
注意:
如果 [Double] 未出現在 [引數型別] 下拉式清單中,請選取 [瀏覽型別]、在 [型別名稱] 方塊中輸入 System.Double,然後按一下 [確定]。 按一下 [建立引數]。
在 [名稱] 方塊中輸入 DiscountPercent,選取 [方向] 下拉式清單中的 [Out],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。
按一下 [建立引數]。
在 [名稱] 方塊中輸入 Total,選取 [方向] 下拉式清單中的 [Out],選取 [引數型別] 下拉式清單中的 [Double],然後按下 ENTER 儲存引數。
按一下工作流程設計工具左下角的 [引數] 按鈕,關閉 [引數] 窗格。
從 [工具箱] 的 [控制流程] 區段,將 [序列] 活動拖放到工作流程設計工具介面上。
從 [工具箱] 的 [移轉] 區段,將 [Interop] 活動拖放到 [序列] 活動內。
按 [按一下即可瀏覽] 標籤上的 [Interop] 活動,在 [型別名稱] 方塊中輸入 DiscountCalculator,然後按一下 [確定]。
注意:
將 Interop 活動加入至工作流程中,並將 DiscountCalculator
型別指定為其 ActivityType 時,Interop 活動會公開三個 In 引數和三個 Out 引數 (代表DiscountCalculator
活動的三個公用屬性)。 In 引數的名稱與三個公用屬性的名稱相同,而三個 Out 引數的名稱則是屬性名稱附加 Out。 在下列步驟中,在前述步驟中建立的工作流程引數會繫結至 Interop 活動的引數。在 [DiscountPercentOut] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 DiscountPercent,然後按下 TAB 鍵。
在 [Subtotal] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 Subtotal,然後按下 TAB 鍵。
在 [TotalOut] 屬性右邊的 [輸入 VB 運算式] 方塊中輸入 Total,然後按下 TAB 鍵。
以滑鼠右鍵按一下 [方案總管] 中的 [Program.cs],然後選取 [檢視程式碼]。
將下列
using
陳述式加入至檔案最上方。using System.Collections.Generic;
註解
Main
方法中對CalculateDiscountInCode
方法的呼叫,然後加入下列程式碼。注意:
如果您未遵循前述程序,而出現預設的 Main
程式碼,請以下列程式碼取代Main
的內容。static void Main(string[] args) { CalculateDiscountUsingDesignerWorkflow(); //CalculateDiscountUsingCodeWorkflow(); }
在名為
CalculateDiscountUsingDesignerWorkflow
的Program
類別中建立新方法,其中包含下列程式碼。static void CalculateDiscountUsingDesignerWorkflow() { double SubtotalValue = 125.99; Dictionary<string, object> wfargs = new Dictionary<string, object> { {"Subtotal", SubtotalValue} }; Activity wf = new DiscountWorkflow(); IDictionary<string, object> outputs = WorkflowInvoker.Invoke(wf, wfargs); Console.WriteLine("Subtotal: {0:C}, Discount {1}%, Total {2:C}", SubtotalValue, (double)outputs["DiscountPercent"] * 100, outputs["Total"]); }
按 CTRL+F5 建置並執行應用程式。 若要指定不同的
Subtotal
金額,請變更下列程式碼中SubtotalValue
的值。double SubtotalValue = 125.99; // Change this value.
規則功能概觀
WF 規則引擎可支援以優先順序為主的方式處理規則,並且支援向前鏈結。 規則可針對單一項目或集合中之項目進行評估。 如需規則概觀與特定規則功能的詳細資訊,請參閱下表。
規則功能 | 文件 |
---|---|
規則概觀 |
|
RuleSet |
在工作流程中使用 RuleSet 與 RuleSet |
規則評估 |
|
規則鏈結 |
|
處理規則中的集合 |
|
使用 PolicyActivity |
使用 PolicyActivity 活動與 PolicyActivity |
在 .NET Framework 4 中建立的工作流程不會使用 WF 提供的所有規則功能,例如宣告式活動條件及條件式活動 (例如 ConditionedActivityGroup 和 ReplicatorActivity)。 如有必要,這個功能可供以 .NET Framework 3.0 和 .NET Framework 3.5 建立的工作流程使用。 如需詳細資訊,請參閱移轉工作流程.