本主题适用于 Windows Workflow Foundation 4。
通过使用 Interop 活动,可在 .NET Framework 4 工作流中使用通过 .NET Framework 3.0 或 .NET Framework 3.5 创建的活动。本主题概述如何使用 Interop 活动。
Visual Basic 注意: |
|---|
| 除非工作流项目的“目标框架”设置设为“.Net Framework 4”,否则 Interop 活动不会显示在工作流设计器工具箱中。 |
在 .NET Framework 4 工作流中使用 Interop 活动
在本主题中,将要创建一个包含 DiscountCalculator 活动的 .NET Framework 3.5 活动库。DiscountCalculator 基于购买量计算折扣,它由包含一个 PolicyActivity 的 SequenceActivity 组成。
注意: |
|---|
| 本主题中创建的 .NET Framework 3.5 活动使用 PolicyActivity 来实现该活动的逻辑。不必使用自定义 .NET Framework 3.5 活动或 Interop 活动也能在 .NET Framework 4 工作流中使用规则。有关在不使用 Interop 活动的情况下在 .NET Framework 4 工作流中使用规则的示例,请参见.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”,然后选择“视图设计器”**。
将**“Policy”活动从“工具箱”的“Windows Workflow v3.0”部分拖放到“DiscountCalculator”**活动中。
提示:如果“工具箱”窗口不可见,请从“视图”菜单中选择“工具箱”。
配置规则
如果新添加的**“Policy”**活动尚未选中,请单击该活动将其选中。
在**“属性”窗口中单击“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”,然后选择“属性”**。
在**“目标框架”下拉列表中,将所选项从“.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(); }在
Program类中创建一个名为CalculateDiscountUsingCodeWorkflow的新方法,此方法包含以下代码。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数据流入 Interop 活动中,因此Subtotal作为 In 参数添加,由于DiscountPercent和Total的数据流出 Interop 活动,因此它们作为 Out 参数添加。请注意,这两个 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,从“方向”下拉列表中选择“输入”,再从“参数类型”下拉列表中选择“Double”**,然后按 Enter 键保存该参数。
注意:如果“Double”不在“参数类型”下拉列表中,请选择“浏览类型…”,然后在“类型名称”框中键入 System.Double,再单击“确定”。 单击**“创建参数”**。
在**“名称”框中键入 DiscountPercent,从“方向”下拉列表中选择“输出”,再从“参数类型”下拉列表中选择“Double”**,然后按 Enter 键保存该参数。
单击**“创建参数”**。
在**“名称”框中键入 Total,从“方向”下拉列表中选择“输出”,再从“参数类型”下拉列表中选择“Double”**,然后按 Enter 键保存该参数。
单击工作流设计器左下方的**“参数”按钮,以关闭“参数”**窗格。
将**“Sequence”活动从“工具箱”的“控制流”**部分拖放到工作流设计器图面。
将**“Interop”活动从“工具箱”的“迁移”部分拖放到“Sequence”**活动中。
在**“单击浏览…”标签上单击“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(); }在
Program类中创建一个名为CalculateDiscountUsingDesignerWorkflow的新方法,此方法包含以下代码。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 规则引擎为以基于优先级别的方式处理规则提供支持,并且支持正向链接。可为单个项或集合中的多个项计算规则。有关规则的概述以及特定规则功能的信息,请参考下表。
| 规则功能 | 文档 |
|---|---|
规则概述 |
Introduction to the Windows Workflow Foundation Rules Engine(Windows Workflow Foundation 规则引擎简介) |
规则集 |
Using RuleSets in Workflows(在工作流中使用规则集)和 RuleSet |
规则计算 |
|
规则链接 |
Forward Chaining Control(正向链接控制)和 Forward Chaining of Rules(规则的正向链接) |
处理规则中的集合 |
|
使用 PolicyActivity |
Using the PolicyActivity Activity(使用 PolicyActivity 活动)和 PolicyActivity |
.NET Framework 4 中创建的工作流不使用 WF 提供的所有规则功能,例如声明性活动条件以及诸如 ConditionedActivityGroup 和 ReplicatorActivity 等条件活动。如果需要,此功能可用于使用 .NET Framework 3.0 和 .NET Framework 3.5 创建的工作流。有关更多信息,请参见迁移工作流.