Udostępnij za pośrednictwem


Używanie rozszerzeń działania

Działania mogą wchodzić w interakcje z rozszerzeniami aplikacji przepływu pracy, które umożliwiają hostowi udostępnianie dodatkowych funkcji, które nie są jawnie modelowane w przepływie pracy. W tym temacie opisano sposób tworzenia i używania rozszerzenia w celu zliczenia liczby wykonań działania.

Aby użyć rozszerzenia działania do zliczania wykonań

  1. Otwórz program Visual Studio 2010. Wybierz pozycję Nowy, Projekt. W węźle Visual C# wybierz pozycję Przepływ pracy. Wybierz pozycję Aplikacja konsoli przepływu pracy z listy szablonów. Nadaj projektowi Extensionsnazwę . Kliknij przycisk OK, aby utworzyć projekt.

  2. Dodaj dyrektywę using w pliku Program.cs dla przestrzeni nazw System.Collections.Generic .

    using System.Collections.Generic;
    
  3. W pliku Program.cs utwórz nową klasę o nazwie ExecutionCountExtension. Poniższy kod tworzy rozszerzenie przepływu pracy, które śledzi identyfikatory wystąpień po wywołaniu 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. Utwórz działanie, które korzysta z rozszerzenia ExecutionCountExtension. Poniższy kod definiuje działanie, które pobiera obiekt ExecutionCountExtension ze środowiska uruchomieniowego i wywołuje metodę Register podczas wykonywania działania.

    // 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. Zaimplementuj działanie w metodzie Main pliku program.cs. Poniższy kod zawiera metody generowania dwóch różnych przepływów pracy, wykonywania każdego przepływu pracy kilka razy i wyświetlania wynikowych danych zawartych w rozszerzeniu.

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