Opciones de creación de actividades en WF

.NET Framework 4.6.1 proporciona varias opciones para crear actividades personalizadas. El método correcto que usar para crear una actividad determinada depende de las características en tiempo de ejecución que se requieran.

Decidir qué clase base de actividad usar para crear actividades personalizadas

En la siguiente tabla se muestran las características disponibles en las clases base de actividad personalizadas.

Clase base de actividad Características disponibles
Activity Crea grupos de actividades proporcionadas por el sistema y personalizadas en una actividad compuesta.
CodeActivity Implementa la funcionalidad imperativa proporcionando un método Execute que se puede invalidar. También proporciona acceso a seguimiento, variables y argumentos.
NativeActivity Proporciona todas las características de CodeActivity, además de anular la ejecución de actividades, cancelar la ejecución de actividades secundarias, usar marcadores y programar actividades, acciones de actividad y funciones.
DynamicActivity Proporciona un enfoque de tipo DOM para construir actividades que interactúen con el diseñador WF y la maquinaria en tiempo de ejecución a través de ICustomTypeDescriptor, con lo que se permite la creación de nuevas actividades sin definir nuevos tipos.

Crear actividades mediante la actividad

Las actividades que se derivan de Activity crean la funcionalidad ensamblando otras actividades existentes. Estas actividades pueden ser actividades personalizadas existentes y actividades de la biblioteca de actividades de .NET Framework 4.6.1. Ensamblar estas actividades es la manera más básica de crear la funcionalidad personalizada. Lo normal es que se use este enfoque cuando se trata de un entorno de diseño visual para crear flujos de trabajo.

Crear actividades mediante CodeActivity o AsyncCodeActivity

Las actividades que se derivan de CodeActivity o AsyncCodeActivitypueden implementar la funcionalidad imperativa invalidando el método Execute con código imperativo personalizado. Se ejecuta el código personalizado cuando el tiempo de ejecución ejecuta la actividad. Aunque las actividades creadas de esta forma tienen acceso a la funcionalidad personalizada, no tienen acceso a todas las características del tiempo de ejecución, como el acceso total al entorno de ejecución, la posibilidad de programar actividades secundarias, la creación de marcadores o compatibilidad con un método Abort o Cancel. Cuando CodeActivity se ejecuta, tiene acceso a una versión reducida del entorno de ejecución (a través de la clase CodeActivityContext o AsyncCodeActivityContext). Las actividades creadas usando CodeActivity tienen acceso al argumento y la resolución de variables, extensiones y seguimiento. La programación de la actividad asincrónica se puede hacer mediante AsyncCodeActivity.

Crear actividades mediante NativeActivity

Las actividades que deriven de NativeActivity, como aquéllas que derivan de CodeActivity, crean la funcionalidad imperativa invalidando Execute, pero también tienen acceso a toda la funcionalidad del tiempo de ejecución del flujo de trabajo a través de NativeActivityContext que se transfiere al método Execute. Este contexto admite programar y cancelar actividades secundarias, ejecutar objetos ActivityAction y ActivityFunc<TResult>, hacer fluir transacciones en un flujo de trabajo, invocar procesos asincrónicos, cancelar y anular la ejecución, tener acceso a propiedades y extensiones de ejecución, y marcadores (controladores para reanudar flujos de trabajo en pausa).

Crear actividades mediante DynamicActivity

A diferencia de los otros tres tipos de actividad, la nueva funcionalidad no se crea derivando los nuevos tipos de DynamicActivity (la clase está sellada) sino ensamblando la funcionalidad en las propiedades Properties y Implementation mediante el uso de un modelo de objeto de documento (DOM) de actividad.

Crear actividades que devuelven un resultado

Muchas actividades deben devolver un resultado después de su ejecución. Aunque siempre es posible definir una clase OutArgument<T> personalizada en una actividad para este propósito, se aconseja usar en su lugar Activity<TResult> o derivar de CodeActivity<TResult> o NativeActivity<TResult>. Cada una de estas clases base tiene un resultado denominado OutArgument<T> que su actividad puede usar para el valor de devolución. Las actividades que devuelven un resultado se deben usar únicamente si solo se necesita devolver un resultado desde una actividad; si se necesita devolver múltiples resultados, se deben usar miembros de OutArgument<T> diferentes en su lugar.