Crear una actividad en el tiempo de ejecución con DynamicActivity
DynamicActivity es una clase concreta sellada con un constructor público. DynamicActivity se puede usar para ensamblar la funcionalidad de actividad en tiempo de ejecución con un DOM de actividad.
Características de DynamicActivity
DynamicActivity tiene acceso a las propiedades, argumentos y variables de ejecución pero no a los servicios en tiempo de ejecución como la programación de actividades secundarias o el seguimiento.
Las propiedades de nivel superior se pueden establecer con los objetos Argument de flujo de trabajo. En código imperativo, estos argumentos se crean usando las propiedades CLR en un nuevo tipo. En XAML, se declaran con las etiquetas x:Class
y x:Member
.
Las actividades se construyeron mediante la interfaz DynamicActivity con el diseñador usando ICustomTypeDescriptor. Las actividades creadas en el diseñador se pueden cargar dinámicamente mediante Load, tal y como se muestra en el siguiente procedimiento.
Para crear una actividad en tiempo de ejecución con el código imperativo, haga lo siguiente:
Abra Visual Studio 2010.
Seleccione Archivo, Nuevo, Proyecto. Seleccione Workflow 4.0 en Visual C# en la ventana Tipos de proyecto y seleccione el nodo v2010. Seleccione Aplicación de consola de flujos de trabajo secuenciales en la ventana Plantillas. Proporcione el nombre siguiente al nuevo proyecto: DynamicActivitySample.
Haga clic con el botón derecho en Workflow1.xaml en el proyecto HelloActivity y seleccione Eliminar.
Abra Program.cs. Agregue la siguiente directiva a la parte superior del archivo.
using System.Collections.Generic;
Sustituya el contenido del método
Main
con el siguiente código, que crea una actividad Sequence que contiene una actividad WriteLine única y la asigna a la propiedad Implementation de una nueva actividad dinámica.//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();
Ejecute la aplicación. Aparece la ventana de la consola con el texto "Hola mundo".
Para crear una actividad en tiempo de ejecución con XAML, haga lo siguiente:
Abra Visual Studio 2010.
Seleccione Archivo, Nuevo, Proyecto. Seleccione Workflow 4.0 en Visual C# en la ventana Tipos de proyecto y seleccione el nodo v2010. Seleccione Aplicación de consola de flujos de trabajo en la ventana Plantillas. Proporcione el nombre siguiente al nuevo proyecto: DynamicActivitySample.
Abra Workflow1.xaml en el proyecto HelloActivity. Haga clic en la opción Argumentos en la parte inferior del diseñador. Cree un nuevo argumento
In
llamadoTextToWrite
de tipoString
.Arrastre una actividad WriteLine de la sección Primitivas del cuadro de herramientas a la superficie del diseñador. Asigne el valor
TextToWrite
a la propiedad Text de la actividad.Abra Program.cs. Agregue la siguiente directiva a la parte superior del archivo.
using System.Activities.XamlIntegration;
Reemplace el contenido del método
Main
por el siguiente código.Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml"); results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } }); Console.ReadLine();
Ejecute la aplicación. Aparece la ventana de la consola con el texto "Hola mundo".
Haga clic con el botón derecho en el archivo Workflow1.xaml en el Explorador de soluciones y seleccione Ver código. Tenga en cuenta que la clase de actividad se crea con
x:Class
y la propiedad se crea conx:Property
.