Использование модулей действий
Действия могут взаимодействовать с расширениями приложений рабочих процессов. Благодаря этому узел может предоставлять дополнительные возможности, которые не были явно смоделированы в рабочем процессе. В этом разделе описывается создание расширений для подсчета количества выполнений действия.
Использования расширения действия для подсчета выполнений
Откройте Visual Studio 2010. Выберите "Создать", "Проект". В узле Visual C# выберите Рабочий процесс. Выберите консольное приложение рабочего процесса из списка шаблонов. Присвойте проекту имя
Extensions
. Нажмите кнопку ОК, чтобы создать проект.Добавьте директиву
using
в файл Program.cs для пространства имен System.Collections.Generic .using System.Collections.Generic;
В файле Program.cs создайте класс с именем ExecutionCountExtension. Следующий код создает расширение рабочего процесса, которое отслеживает идентификаторы экземпляров при вызове метода 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); } } }
Создайте действие, которое использует 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. В следующем коде содержатся методы для создания двух различных рабочих процессов, выполнения всех процессов по несколько раз и отображения полученных данных, содержащихся в расширении.
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)); } }