Sdílet prostřednictvím


Používání rozšíření aktivit

Aktivity můžou pracovat s rozšířeními aplikace pracovního postupu, které hostiteli umožňují poskytovat další funkce, které nejsou explicitně modelovány v pracovním postupu. Toto téma popisuje, jak vytvořit a použít rozšíření ke zjištění počtu spuštění aktivity.

Použití rozšíření aktivity k počítání spuštění

  1. Otevřete Visual Studio 2010. Vyberte Nový, Projekt. V uzlu Visual C# vyberte Pracovní postup. V seznamu šablon vyberte konzolovou aplikaci pracovního postupu. Pojmenujte projekt Extensions. Kliknutím na tlačítko OK vytvořte projekt.

  2. using Do souboru Program.cs přidejte direktivu pro obor názvů System.Collections.Generic.

    using System.Collections.Generic;
    
  3. V Program.cs souboru vytvořte novou třídu s názvem ExecutionCountExtension. Následující kód vytvoří rozšíření pracovního postupu, které sleduje ID instancí při volání metody Register .

    // 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. Vytvořte aktivitu, která využívá ExecutionCountExtension. Následující kód definuje aktivitu, která načte ExecutionCountExtension objekt z modulu runtime a volá jeho metodu Register při spuštění aktivity.

    // 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. Implementujte aktivitu v metodě Main souboru program.cs. Následující kód obsahuje metody pro generování dvou různých pracovních postupů, provádění každého pracovního postupu několikrát a zobrazení výsledných dat obsažených v rozšíření.

    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));
        }
    }