Поделиться через


Создание действия в среде выполнения с динамическим действием

DynamicActivity представляет собой конкретный запечатанный класс с открытым конструктором. DynamicActivity можно использовать для сборки функциональных возможностей действий во время выполнения с помощью DOM действия.

Возможности DynamicActivity

DynamicActivity имеет доступ к свойствам, аргументам и переменным выполнения, но не имеет доступа к службам среды выполнения, таким как дочерние действия планирования и отслеживание.

Значения свойств верхнего уровня можно задавать при помощи объектов рабочих процессов Argument. В императивном коде эти аргументы создаются при помощи свойств среды CLR в новом типе. На языке XAML такие аргументы объявляются при помощи тегов x:Class и x:Member.

Действия, построенные при помощи интерфейса DynamicActivity в конструкторе, использующем ICustomTypeDescriptor. Действия, созданные в конструкторе, можно загружать динамически с помощью Load, как показано в следующей процедуре.

Создание действия во время выполнения с помощью императивного кода

  1. OpenVisual Studio 2010.

  2. Выберите "Файл", "Создать", "Проект". Выберите рабочий процесс 4.0 в разделе Visual C# в окне "Типы проектов " и выберите узел версии 2010 . Выберите последовательное консольное приложение консоли рабочего процесса в окне шаблонов . Задайте имя для нового проекта DynamicActivitySample.

  3. Щелкните правой кнопкой мыши Workflow1.xaml в проекте HelloActivity и выберите "Удалить".

  4. Откройте Program.cs. Добавьте следующую директиву в начало файла.

    using System.Collections.Generic;  
    
  5. Замените содержимое метода Main следующим кодом, который создаст действие Sequence, содержащее отдельное действие WriteLine, и назначит его свойству Implementation нового динамического действия.

    //Define the input argument for the activity  
    var textOut = new InArgument<string>();  
    //Create the activity, property, and implementation  
                Activity dynamicWorkflow = new DynamicActivity()  
                {  
                    Properties =
                    {  
                        new DynamicActivityProperty  
                        {  
                            Name = "Text",  
                            Type = typeof(InArgument<String>),  
                            Value = textOut  
                        }  
                    },  
                    Implementation = () => new Sequence()  
                    {  
                        Activities =
                        {  
                            new WriteLine()  
                            {  
                                Text = new InArgument<string>(env => textOut.Get(env))  
                            }  
                        }  
                    }  
                };  
    //Execute the activity with a parameter dictionary  
                WorkflowInvoker.Invoke(dynamicWorkflow, new Dictionary<string, object> { { "Text", "Hello World!" } });  
                Console.ReadLine();  
    
  6. Запустите приложение. Окно консоли с текстом "Hello World!" отображается.

Создание действия во время выполнения с помощью XAML

  1. Откройте Visual Studio 2010.

  2. Выберите "Файл", "Создать", "Проект". Выберите рабочий процесс 4.0 в разделе Visual C# в окне "Типы проектов " и выберите узел версии 2010 . Выберите консольное приложение рабочего процесса в окне "Шаблоны ". Задайте имя для нового проекта DynamicActivitySample.

  3. Откройте файл Workflow1.xaml в проекте HelloActivity. Щелкните параметр "Аргументы" в нижней части конструктора. Создайте новый аргумент In, вызываемый методом TextToWrite типа String.

  4. Перетащите действие WriteLine из раздела "Примитивы " панели элементов в область конструктора. Назначьте значение TextToWrite свойству Text действия.

  5. Откройте Program.cs. Добавьте следующую директиву в начало файла.

    using System.Activities.XamlIntegration;  
    
  6. Замените содержимое метода Main указанным ниже кодом.

    Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml");  
                    results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } });  
    Console.ReadLine();  
    
  7. Запустите приложение. Откроется окно консоли с текстом "Hello World!"

  8. Щелкните правой кнопкой мыши файл Workflow1.xaml в Обозреватель решений и выберите "Просмотреть код". Следует отметить, что класс действия создается при помощи x:Class, а свойство - при помощи x:Property.

См. также