Параметры разработки действий в WF
платформа .NET Framework 4.6.1 предоставляет несколько вариантов создания пользовательских действий. Выбор правильного метода создания определенного действия зависит от требований возможностей времени выполнения.
Выбор базового класса действий для разработки настраиваемых действий
В следующей таблице перечислены функции, доступные в базовых классах настраиваемых действий.
Базовый класс действия | Доступные возможности |
---|---|
Activity | Формирует составное действие из групп системных и настраиваемых действий. |
CodeActivity | Реализует императивные функции путем предоставления метода Execute, который можно переопределить. Также обеспечивает доступ к отслеживанию, переменным и аргументам. |
NativeActivity | Обеспечивает все функции CodeActivity, а также прерывание выполнения действий, отмену выполнения дочерних действий, использование закладок, а также планирование действий, задач действий и функций. |
DynamicActivity | Обеспечивает подход, схожий с DOM, к действиям построения, при которых используется конструктор WF и механизмы среды выполнения с ICustomTypeDescriptor, что обеспечивает возможность создания новых действий без определения новых типов. |
Разработка действий с помощью действия
Действия, которые являются производными от Activity, реализуют функциональность путем сборки других существующих действий. Это могут быть существующие пользовательские действия и действия из библиотеки действий платформа .NET Framework 4.6.1. Сборка этих действий является наиболее простым способом создания пользовательских функциональных возможностей. Этот подход обычно используется при создании рабочих процессов в среде виртуальной разработки.
Разработка действий с помощью CodeActivity или AsyncCodeActivity
Действия, которые являются производными от CodeActivity или AsyncCodeActivity, могут реализовывать императивные функции путем переопределения метода Execute с помощью настраиваемого императивного кода. Настраиваемый код выполняется при выполнении действия средой выполнения. Действия, созданные таким образом, имеют доступ к пользовательским функциям, но не ко всем функциям среды выполнения, таким как полный доступ к среде выполнения, возможность планировать дочерние действия, создание закладок и поддержка методов Cancel или Abort. При своем выполнении CodeActivity получает доступ к сокращенной версии среды выполнения (посредством класса CodeActivityContext или AsyncCodeActivityContext). Действия, созданные с помощью CodeActivity, имеют доступ к разрешению аргументов и переменных, расширениям и отслеживанию. Асинхронное планирование действий можно выполнить с помощью AsyncCodeActivity.
Разработка действий с помощью NativeActivity
Действия, которые являются производными от NativeActivity аналогично производным действиям от CodeActivity, создают императивные функции путем переопределения Execute, но также имеют доступ ко всем функциям среды выполнения рабочего процесса благодаря NativeActivityContext, который передается методу Execute. Этот контекст поддерживает планирование и отмену дочерних действий, выполнение объектов ActivityAction и ActivityFunc<TResult>, потоки транзакций в рабочем процессе, вызов асинхронных процессов, отмену и прерывание выполнения, доступ к свойствам выполнения и расширениям, а также закладки (маркеры для возобновления приостановленных рабочих процессов).
Разработка действий с помощью DynamicActivity
В отличие от трех других типов действий новая функциональность создается не путем создания новых типов из DynamicActivity (этот класс является запечатанным), а путем сборки функциональности в свойства Properties и Implementation с помощью модели DOM действий.
Разработка действий, возвращающих результат
Многие действия должны возвращать результат после выполнения. Хотя для этих целей всегда можно определить настраиваемый OutArgument<T> для действия, рекомендуется вместо этого использовать Activity<TResult> или сформировать из CodeActivity<TResult> или NativeActivity<TResult>. Все эти базовые классы имеют аргумент OutArgument<T> с именем Result, который действие может использовать для возвращаемого значения. Действия, возвращающие результат, должны использоваться, только если требуется возвратить из действия лишь один результат. Если требуется возвратить несколько результатов, следует использовать отдельные члены OutArgument<T>.