Usar la actividad Interop en un flujo de trabajo de .NET Framework 4
Este tema es aplicable a Windows Workflow Foundation 4.
Las actividades creadas con .NET Framework 3.0 o .NET Framework 3,5 pueden usarse en un flujo de trabajo de .NET Framework 4 mediante la actividad Interop. En este tema se proporciona información general sobre el uso de la actividad Interop.
Nota: de Visual Basic |
---|
La actividad Interop no aparece en el cuadro de herramientas del diseñador de flujo de trabajo a menos que el proyecto del flujo de trabajo tenga la opción Versión de .NET Framework de destino definida en .Net Framework 4. |
Usar la actividad Interop en flujos de trabajo de .NET Framework 4
En este tema, se crea una biblioteca de actividades de .NET Framework 3,5 que contiene una actividad DiscountCalculator
. DiscountCalculator
calcula un descuento basado en el importe de una compra y consta de una clase SequenceActivity que contiene una PolicyActivity.
Nota: |
---|
La actividad de .NET Framework 3,5 creada en este tema usa PolicyActivity para implementar la lógica de la actividad. No es necesario para usar una actividad .NET Framework 3,5 personalizada o la actividad Interop a fin de usar reglas en un flujo de trabajo de .NET Framework 4. Para ver un ejemplo de uso de reglas en un flujo de trabajo de .NET Framework 4 sin usar la actividad Interop, vea el ejemplo Actividad Policy en .NET Framework 4. |
Para crear el proyecto de la biblioteca de actividades de .NET Framework 3.5
Abra Visual Studio 2010 y seleccione Nuevo y después Proyecto en el menú Archivo.
Expanda el nodo Otros tipos de proyectos en el recuadro Plantillas instaladas y seleccione Soluciones de Visual Studio.
Seleccione Solución en blanco en la lista Soluciones de Visual Studio. Escriba PolicyInteropDemo en el cuadro Nombre y haga clic en Aceptar.
Haga clic con el botón secundario en PolicyInteropDemo en el Explorador de soluciones y seleccione Agregar y luego Nuevo proyecto.
Sugerencia: Si la ventana Explorador de soluciones no está visible, seleccione Explorador de soluciones en el menú Ver. En la lista Plantillas instaladas, seleccione Visual C# y, a continuación, Flujo de trabajo. Seleccione .NET Framework 3.5 en la lista desplegable de la versión de .NET Framework y, a continuación, seleccione Biblioteca de actividades de flujo de trabajo en la lista Plantillas.
Escriba PolicyActivityLibrary en el cuadro Nombre y haga clic en Aceptar.
Haga clic con el botón secundario en Activity1.cs en el Explorador de soluciones y seleccione Eliminar. Haga clic en Aceptar para confirmar
Para crear la actividad DiscountCalculator
Haga clic con el botón secundario en PolicyActivityLibrary en el Explorador de soluciones y seleccione Agregar y, a continuación, Actividad.
Seleccione Activity (con separación de código) en la lista Elementos de Visual C#. Escriba DiscountCalculator en el cuadro Nombre y haga clic en Aceptar.
Haga clic con el botón secundario en DiscountCalculator.xoml en el Explorador de soluciones y seleccione Ver código.
Agregue las siguientes propiedades a la clase
DiscountCalculator
.public partial class DiscountCalculator : SequenceActivity { public double Subtotal { get; set; } public double DiscountPercent { get; set; } public double Total { get; set; } }
Haga clic con el botón secundario en DiscountCalculator.xoml en el Explorador de soluciones y seleccione Diseñador de vistas.
Arrastre una actividad Policy de la sección Windows Workflow v3.0 del cuadro de herramientas y colóquela en la actividad DiscountCalculator.
Sugerencia: Si la ventana Cuadro de herramientas no está visible, seleccione Cuadro de herramientas en el menú Ver.
Para configurar las reglas
Haga clic en la actividad Policy recién agregada para seleccionarla, si aún no lo estuviera.
Haga clic en la propiedad RuleSetReference de la ventana Propiedades para seleccionarla y después haga clic en el botón de puntos suspensivos situado a la derecha de la propiedad.
Sugerencia: Si la ventana Propiedades no está visible, en el menú Ver, haga clic en Ventana de propiedades. Seleccione la opción para hacer clic en nuevo.
Haga clic en Agregar regla.
Escriba la siguiente expresión en el cuadro Condición.
this.Subtotal >= 50 && this.Subtotal < 100
Escriba la siguiente expresión en el cuadro Acciones Then.
this.DiscountPercent = 0.075
Haga clic en Agregar regla.
Escriba la siguiente expresión en el cuadro Condición.
this.Subtotal >= 100
Escriba la siguiente expresión en el cuadro Acciones Then.
this.DiscountPercent = 0.15
Haga clic en Agregar regla.
Escriba la siguiente expresión en el cuadro Condición.
this.DiscountPercent > 0
Escriba la siguiente expresión en el cuadro Acciones Then.
this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
Escriba la siguiente expresión en el cuadro Acciones Else.
this.Total = this.Subtotal
Haga clic en Aceptar para cerrar el cuadro de diálogo Editor de conjunto de reglas.
Asegúrese de que la clase RuleSet recién creada en la lista Nombre y haga clic en Aceptar.
Presione F6 para compilar la solución.
Las reglas agregadas a la actividad DiscountCalculator
en este procedimiento se muestran en el siguiente ejemplo de código.
Rule1: IF this.Subtotal >= 50 && this.Subtotal < 100
THEN this.DiscountPercent = 0.075
Rule2: IF this. Subtotal >= 100
THEN this.DiscountPercent = 0.15
Rule3: IF this.DiscountPercent > 0
THEN this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
ELSE this.Total = this.Subtotal
Cuando PolicyActivity se ejecuta, estas tres reglas evalúan y modifican los valores de propiedad Subtotal
, Total
y DiscountPercent
de la actividad DiscountCalculator
para calcular el descuento deseado.
Usar la actividad DiscountCalculator con la actividad Interop
Para usar la actividad DiscountCalculator
dentro del flujo de trabajo de .NET Framework 4, se usará la actividad Interop. En esta sección se crean dos flujos de trabajo, uno que usa código y otro que usa diseñador de flujo de trabajo, que a su vez muestran cómo usar la actividad Interop con la actividad DiscountCalculator
. La misma aplicación host se usa para ambos flujos de trabajo.
Para crear la aplicación host
Haga clic con el botón secundario en PolicyInteropDemo en el Explorador de soluciones, seleccione Agregar y después Nuevo proyecto.
Asegúrese de que se haya seleccionado .NET Framework 4 en la lista desplegable de la versión de .NET Framework y seleccione Aplicación de consola de flujos de trabajo en la lista Elementos de Visual C#.
Escriba PolicyInteropHost en el cuadro Nombre y haga clic en Aceptar.
Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Propiedades.
En la lista desplegable Versión de .NET Framework de destino, cambie la selección de .NET Framework 4 Client Profile a .NET Framework 4. Haga clic en Sí para confirmar.
Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar referencia.
Seleccione PolicyActivityLibrary en la pestaña Proyectos y haga clic en Aceptar.
Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar referencia.
Seleccione System.Workflow.Activities, System.Workflow.ComponentModel y, a continuación, System.Workflow.Runtime en la pestaña .NET y haga clic en Aceptar.
Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Establecer como proyecto de inicio.
Presione F6 para compilar la solución.
Usar la actividad Interop en el código
En este ejemplo, se crea una definición de flujo de trabajo mediante el código que contiene las actividades Interop y DiscountCalculator
. Este flujo de trabajo se invoca usando WorkflowInvoker y los resultados de la evaluación de la regla se escriben en la consola mediante una actividad WriteLine.
Para usar la actividad Interop en código
Haga clic con el botón secundario en Program.cs en el Explorador de soluciones y seleccione Ver código.
Agregue la instrucción
using
siguiente en la parte superior del archivo.using PolicyActivityLibrary;
Quite el contenido del método
Main
y sustitúyalo con el código siguiente:static void Main(string[] args) { CalculateDiscountUsingCodeWorkflow(); }
Cree un nuevo método en la clase
Program
denominadaCalculateDiscountUsingCodeWorkflow
que contenga el código siguiente.static void CalculateDiscountUsingCodeWorkflow() { Variable<double> Subtotal = new Variable<double> { Default = 75.99, Name = "Subtotal" }; Variable<double> DiscountPercent = new Variable<double> { Name = "DiscountPercent" }; Variable<double> Total = new Variable<double> { Name = "Total" }; Activity wf = new Sequence { Variables = { Subtotal, DiscountPercent, Total }, Activities = { new Interop { ActivityType = typeof(DiscountCalculator), ActivityProperties = { { "Subtotal", new InArgument<double>(Subtotal) }, { "DiscountPercentOut", new OutArgument<double>(DiscountPercent) }, { "TotalOut", new OutArgument<double>(Total) } } }, new WriteLine { Text = new InArgument<string>(env => string.Format("Subtotal: {0:C}, Discount {1}%, Total {2:C}", Subtotal.Get(env), DiscountPercent.Get(env) * 100, Total.Get(env))) } } }; WorkflowInvoker.Invoke(wf); }
Nota: Las propiedades Subtotal
,DiscountPercent
yTotal
de la actividadDiscountCalculator
aparecen como argumentos de la actividad Interop y están enlazadas a las variables del flujo de trabajo en la colección de la propiedad ActivityProperties de la actividad Interop.Subtotal
se agrega como un argumento de In porque los datos deSubtotal
fluyen hasta la actividad Interop y tantoDiscountPercent
comoTotal
se agregan como argumentos de Out porque los datos fluyen fuera de la actividad Interop. Tenga en cuenta que se agregan los dos argumentos Out con los nombresDiscountPercentOut
yTotalOut
para indicar que representan argumentos Out. El tipoDiscountCalculator
se especifica como ActivityType de la actividad Interop.Presione CTRL+F5 para compilar y ejecutar la aplicación. Sustituya los valores diferentes para que el valor
Subtotal
pruebe los niveles del descuento diferentes proporcionados por la actividadDiscountCalculator
.Variable<double> Subtotal = new Variable<double> { Default = 75.99, // Change this value. Name = "Subtotal" };
Usar la actividad Interop en el Diseñador de flujo de trabajo
En este ejemplo, use crea un flujo de trabajo con el diseñador de flujo de trabajo. Este flujo de trabajo tiene la misma funcionalidad que el ejemplo anterior, excepto que en lugar de usar una actividad WriteLine para mostrar el descuento, la aplicación host recupera y muestra la información del descuento cuando el flujo de trabajo se completa. Asimismo, en lugar de usar las variables de flujo de trabajo locales para contener los datos, los argumentos se crean en el diseñador de flujo de trabajo y los valores se pasan desde el host cuando se invoca el flujo de trabajo.
Para hospedar PolicyActivity usando un flujo de trabajo creado por el Diseñador de flujo de trabajo
Haga clic con el botón secundario en Workflow1.xaml en el Explorador de soluciones y seleccione Eliminar. Haga clic en Aceptar para confirmar
Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar, Nuevo elemento.
Expanda el nodo Elementos de Visual C# y seleccione Flujo de trabajo. Seleccione Actividad en la lista Elementos de Visual C#.
Escriba DiscountWorkflow en el cuadro Nombre y haga clic en Agregar.
Haga clic en el botón Argumentos situado en la parte inferior izquierda del diseñador de flujo de trabajo para mostrar el recuadro Argumentos.
Haga clic en Crear argumento.
Escriba Subtotal en el cuadro Nombre, seleccione En en la lista desplegable Dirección, seleccione Doble en la lista desplegable Tipo de argumento y, a continuación, presione Entrar para guardar el argumento.
Nota: Si Doble no está en la lista desplegable Tipo de argumento, seleccione Buscar tipos, escriba System.Double en el cuadro Nombre de tipo y haga clic en Aceptar. Haga clic en Crear argumento.
Escriba DiscountPercent en el cuadro Nombre, seleccione Salida en la lista desplegable Dirección, seleccione Doble en la lista desplegable Tipo de argumento y, a continuación, presione ENTRAR para guardar el argumento.
Haga clic en Crear argumento.
Escriba Total en el cuadro Nombre, seleccione Salida en la lista desplegable Dirección, seleccione Doble en la lista desplegable Tipo de argumento y, a continuación, presione ENTRAR para guardar el argumento.
Haga clic en el botón Argumentos en el lado inferior izquierdo del diseñador de flujo de trabajo para cerrar el recuadro Argumentos.
Arrastre una actividad Sequence de la sección Flujo de control del cuadro de herramientas y colóquela en la superficie del diseñador de flujo de trabajo.
Arrastre una actividad Interop de la sección Migración del cuadro de herramientas y colóquela en la actividad Sequence.
Haga clic en la actividad Interop en la etiqueta Haga clic para examinar, escriba DiscountCalculator en el cuadro Nombre de tipo y haga clic en Aceptar.
Nota: Cuando la actividad Interop se agrega al flujo de trabajo y el tipo DiscountCalculator
se especifica como su ActivityType, la actividad Interop expone tres argumentos In y tres argumentos Out que representan las tres propiedades públicas de la actividadDiscountCalculator
. Los argumentos In tienen el mismo nombre que las tres propiedades públicas y los tres argumentos Out tienen los mismos nombres con Out anexado al nombre de la propiedad. En los siguientes pasos, los argumentos de flujo de trabajo creados en los pasos anteriores se enlazan a los argumentos de la actividad Interop.Escriba DiscountPercent en el cuadro Escriba una expresión de VB a la derecha de la propiedad DiscountPercentOut y presione TAB.
Escriba Subtotal en el cuadro Escriba una expresión de VB a la derecha de la propiedad Subtotal y presione TAB.
Escriba Total en el cuadro Escriba una expresión de VB a la derecha de la propiedad TotalOut y presione TAB.
Haga clic con el botón secundario en Program.cs en el Explorador de soluciones y seleccione Ver código.
Agregue la instrucción
using
siguiente en la parte superior del archivo.using System.Collections.Generic;
Ponga un comentario sobre la llamada al método
CalculateDiscountInCode
en el métodoMain
y agregue el siguiente código.Nota: Si no siguiera el procedimiento anterior y el código Main
predeterminado estuviera presente, reemplace el contenido deMain
con el siguiente código.static void Main(string[] args) { CalculateDiscountUsingDesignerWorkflow(); //CalculateDiscountUsingCodeWorkflow(); }
Cree un nuevo método en la clase
Program
denominadaCalculateDiscountUsingDesignerWorkflow
que contenga el código siguiente.static void CalculateDiscountUsingDesignerWorkflow() { double SubtotalValue = 125.99; Dictionary<string, object> wfargs = new Dictionary<string, object> { {"Subtotal", SubtotalValue} }; Activity wf = new DiscountWorkflow(); IDictionary<string, object> outputs = WorkflowInvoker.Invoke(wf, wfargs); Console.WriteLine("Subtotal: {0:C}, Discount {1}%, Total {2:C}", SubtotalValue, (double)outputs["DiscountPercent"] * 100, outputs["Total"]); }
Presione CTRL+F5 para compilar y ejecutar la aplicación. Para especificar un importe de
Subtotal
distinto, cambie el valor deSubtotalValue
en el siguiente código.double SubtotalValue = 125.99; // Change this value.
Información general de las características de las reglas
El motor de reglas de WF proporciona soporte técnico para procesar reglas según la prioridad con soporte para el encadenamiento delantero. Las reglas se pueden evaluar para un elemento único o para los elementos de una colección. Para ver una información general de reglas e información sobre la funcionalidad específica de reglas, consulte la siguiente tabla.
Característica de reglas | Documentación |
---|---|
Información general sobre reglas |
Introducción al motor de reglas de Windows Workflow Foundation |
RuleSet |
Usar RuleSets en flujos de trabajo y RuleSet |
Evaluación de reglas |
|
Encadenamiento de reglas |
Control de encadenamiento delantero y Encadenamiento delantero de reglas |
Procesamiento de colecciones en reglas |
|
Usar PolicyActivity |
Usar la actividad PolicyActivity y PolicyActivity |
Los flujos de trabajo creados en .NET Framework 4 no usan todas las características de reglas proporcionadas por WF, como las condiciones de actividad declarativas y las actividades condicionales como, por ejemplo, ConditionedActivityGroup y ReplicatorActivity. Si es necesario, esta funcionalidad está disponible para flujos de trabajo creados con .NET Framework 3.0 y .NET Framework 3,5. Para obtener más información, vea Migrar flujos de trabajo.