使用活动扩展
活动可与工作流应用程序扩展进行交互,这些扩展允许主机提供未在工作流中显式建模的其他功能。 本主题描述如何创建和使用扩展以计算活动的执行次数。
使用活动扩展来计算执行次数
打开 Visual Studio 2010。 依次选择“新建”和“项目”。 在“Visual C#”节点下,选择“工作流”。 从模板列表中选择“工作流控制台应用程序”。 将项目命名为
Extensions
。 单击“确定”以创建该项目。在 Program.cs 文件中为 System.Collections.Generic 命名空间添加
using
指令。using System.Collections.Generic;
在 Program.cs 文件中,创建一个名为 ExecutionCountExtension 的新类。 以下代码将创建一个工作流扩展,此扩展可在调用其 Register 方法时跟踪实例 ID。
// This extension collects a list of workflow Ids public class ExecutionCountExtension { IList<Guid> instances = new List<Guid>(); public int ExecutionCount { get { return this.instances.Count; } } public IEnumerable<Guid> InstanceIds { get { return this.instances; } } public void Register(Guid activityInstanceId) { if (!this.instances.Contains<Guid>(activityInstanceId)) { instances.Add(activityInstanceId); } } }
创建一个使用 ExecutionCountExtension 的活动。 以下代码将定义一个活动,此活动从运行时检索 ExecutionCountExtension 对象并在活动执行时调用其 Register 方法。
// Activity that consumes an extension provided by the host. If the extension is available // in the context, it will invoke (in this case, registers the Id of the executing workflow) public class MyActivity: CodeActivity { protected override void Execute(CodeActivityContext context) { ExecutionCountExtension ext = context.GetExtension<ExecutionCountExtension>(); if (ext != null) { ext.Register(context.WorkflowInstanceId); } } }
在 program.cs 文件的 Main 方法中实现该活动。 以下代码包含用于生成两个不同的工作流、将每个工作流执行多次以及显示扩展中包含的结果数据的方法。
class Program { // Creates a workflow that uses the activity that consumes the extension static Activity CreateWorkflow1() { return new Sequence { Activities = { new MyActivity() } }; } // Creates a workflow that uses two instances of the activity that consumes the extension static Activity CreateWorkflow2() { return new Sequence { Activities = { new MyActivity(), new MyActivity() } }; } static void Main(string[] args) { // create the extension ExecutionCountExtension executionCountExt = new ExecutionCountExtension(); // configure the first invoker and execute 3 times WorkflowInvoker invoker = new WorkflowInvoker(CreateWorkflow1()); invoker.Extensions.Add(executionCountExt); invoker.Invoke(); invoker.Invoke(); invoker.Invoke(); // configure the second invoker and execute 2 times WorkflowInvoker invoker2 = new WorkflowInvoker(CreateWorkflow2()); invoker2.Extensions.Add(executionCountExt); invoker2.Invoke(); invoker2.Invoke(); // show the data in the extension Console.WriteLine("Executed {0} times", executionCountExt.ExecutionCount); executionCountExt.InstanceIds.ToList().ForEach(i => Console.WriteLine("...{0}", i)); } }