使用活动扩展

活动可与工作流应用程序扩展进行交互,这些扩展允许主机提供未在工作流中显式建模的其他功能。 本主题描述如何创建和使用扩展以计算活动的执行次数。

使用活动扩展来计算执行次数

  1. 打开 Visual Studio 2010。 依次选择“新建”和“项目”。 在“Visual C#”节点下,选择“工作流”。 从模板列表中选择“工作流控制台应用程序”。 将项目命名为 Extensions。 单击“确定”以创建该项目。

  2. 在 Program.cs 文件中为 System.Collections.Generic 命名空间添加 using 指令。

    using System.Collections.Generic;
    
  3. 在 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);
            }
        }
    }
    
  4. 创建一个使用 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);
            }
    
        }
    }
    
  5. 在 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));
        }
    }