Создание действия в среде выполнения с динамическим действием
DynamicActivity представляет собой конкретный запечатанный класс с открытым конструктором. DynamicActivity можно использовать для сборки функциональных возможностей действий во время выполнения с помощью DOM действия.
Возможности DynamicActivity
DynamicActivity имеет доступ к свойствам, аргументам и переменным выполнения, но не имеет доступа к службам среды выполнения, таким как дочерние действия планирования и отслеживание.
Значения свойств верхнего уровня можно задавать при помощи объектов рабочих процессов Argument. В императивном коде эти аргументы создаются при помощи свойств среды CLR в новом типе. На языке XAML такие аргументы объявляются при помощи тегов x:Class
и x:Member
.
Действия, построенные при помощи интерфейса DynamicActivity в конструкторе, использующем ICustomTypeDescriptor. Действия, созданные в конструкторе, можно загружать динамически с помощью Load, как показано в следующей процедуре.
Создание действия во время выполнения с помощью императивного кода
OpenVisual Studio 2010.
Выберите "Файл", "Создать", "Проект". Выберите рабочий процесс 4.0 в разделе Visual C# в окне "Типы проектов " и выберите узел версии 2010 . Выберите последовательное консольное приложение консоли рабочего процесса в окне шаблонов . Задайте имя для нового проекта DynamicActivitySample.
Щелкните правой кнопкой мыши Workflow1.xaml в проекте HelloActivity и выберите "Удалить".
Откройте Program.cs. Добавьте следующую директиву в начало файла.
using System.Collections.Generic;
Замените содержимое метода
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();
Запустите приложение. Окно консоли с текстом "Hello World!" отображается.
Создание действия во время выполнения с помощью XAML
Откройте Visual Studio 2010.
Выберите "Файл", "Создать", "Проект". Выберите рабочий процесс 4.0 в разделе Visual C# в окне "Типы проектов " и выберите узел версии 2010 . Выберите консольное приложение рабочего процесса в окне "Шаблоны ". Задайте имя для нового проекта DynamicActivitySample.
Откройте файл Workflow1.xaml в проекте HelloActivity. Щелкните параметр "Аргументы" в нижней части конструктора. Создайте новый аргумент
In
, вызываемый методомTextToWrite
типаString
.Перетащите действие WriteLine из раздела "Примитивы " панели элементов в область конструктора. Назначьте значение
TextToWrite
свойству Text действия.Откройте Program.cs. Добавьте следующую директиву в начало файла.
using System.Activities.XamlIntegration;
Замените содержимое метода
Main
указанным ниже кодом.Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml"); results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } }); Console.ReadLine();
Запустите приложение. Откроется окно консоли с текстом "Hello World!"
Щелкните правой кнопкой мыши файл Workflow1.xaml в Обозреватель решений и выберите "Просмотреть код". Следует отметить, что класс действия создается при помощи
x:Class
, а свойство - при помощиx:Property
.