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.

Ee264174.note(es-es,VS.100).gif 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.

Ee264174.note(es-es,VS.100).gifNota:
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

  1. Abra Visual Studio 2010 y seleccione Nuevo y después Proyecto en el menú Archivo.

  2. Expanda el nodo Otros tipos de proyectos en el recuadro Plantillas instaladas y seleccione Soluciones de Visual Studio.

  3. Seleccione Solución en blanco en la lista Soluciones de Visual Studio. Escriba PolicyInteropDemo en el cuadro Nombre y haga clic en Aceptar.

  4. Haga clic con el botón secundario en PolicyInteropDemo en el Explorador de soluciones y seleccione Agregar y luego Nuevo proyecto.

    Ee264174.Tip(es-es,VS.100).gifSugerencia:
    Si la ventana Explorador de soluciones no está visible, seleccione Explorador de soluciones en el menú Ver.

  5. 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.

  6. Escriba PolicyActivityLibrary en el cuadro Nombre y haga clic en Aceptar.

  7. 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

  1. Haga clic con el botón secundario en PolicyActivityLibrary en el Explorador de soluciones y seleccione Agregar y, a continuación, Actividad.

  2. 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.

  3. Haga clic con el botón secundario en DiscountCalculator.xoml en el Explorador de soluciones y seleccione Ver código.

  4. 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; }
    }
    
  5. Haga clic con el botón secundario en DiscountCalculator.xoml en el Explorador de soluciones y seleccione Diseñador de vistas.

  6. Arrastre una actividad Policy de la sección Windows Workflow v3.0 del cuadro de herramientas y colóquela en la actividad DiscountCalculator.

    Ee264174.Tip(es-es,VS.100).gifSugerencia:
    Si la ventana Cuadro de herramientas no está visible, seleccione Cuadro de herramientas en el menú Ver.

Para configurar las reglas

  1. Haga clic en la actividad Policy recién agregada para seleccionarla, si aún no lo estuviera.

  2. 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.

    Ee264174.Tip(es-es,VS.100).gifSugerencia:
    Si la ventana Propiedades no está visible, en el menú Ver, haga clic en Ventana de propiedades.

  3. Seleccione la opción para hacer clic en nuevo.

  4. Haga clic en Agregar regla.

  5. Escriba la siguiente expresión en el cuadro Condición.

    this.Subtotal >= 50 && this.Subtotal < 100
    
  6. Escriba la siguiente expresión en el cuadro Acciones Then.

    this.DiscountPercent = 0.075
    
  7. Haga clic en Agregar regla.

  8. Escriba la siguiente expresión en el cuadro Condición.

    this.Subtotal >= 100
    
  9. Escriba la siguiente expresión en el cuadro Acciones Then.

    this.DiscountPercent = 0.15
    
  10. Haga clic en Agregar regla.

  11. Escriba la siguiente expresión en el cuadro Condición.

    this.DiscountPercent > 0
    
  12. Escriba la siguiente expresión en el cuadro Acciones Then.

    this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
    
  13. Escriba la siguiente expresión en el cuadro Acciones Else.

    this.Total = this.Subtotal
    
  14. Haga clic en Aceptar para cerrar el cuadro de diálogo Editor de conjunto de reglas.

  15. Asegúrese de que la clase RuleSet recién creada en la lista Nombre y haga clic en Aceptar.

  16. 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 DiscountPercentde 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

  1. Haga clic con el botón secundario en PolicyInteropDemo en el Explorador de soluciones, seleccione Agregar y después Nuevo proyecto.

  2. 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#.

  3. Escriba PolicyInteropHost en el cuadro Nombre y haga clic en Aceptar.

  4. Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Propiedades.

  5. 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 para confirmar.

  6. Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar referencia.

  7. Seleccione PolicyActivityLibrary en la pestaña Proyectos y haga clic en Aceptar.

  8. Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar referencia.

  9. Seleccione System.Workflow.Activities, System.Workflow.ComponentModel y, a continuación, System.Workflow.Runtime en la pestaña .NET y haga clic en Aceptar.

  10. Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Establecer como proyecto de inicio.

  11. 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

  1. Haga clic con el botón secundario en Program.cs en el Explorador de soluciones y seleccione Ver código.

  2. Agregue la instrucción using siguiente en la parte superior del archivo.

    using PolicyActivityLibrary;
    
  3. Quite el contenido del método Main y sustitúyalo con el código siguiente:

    static void Main(string[] args)
    {
        CalculateDiscountUsingCodeWorkflow();
    }
    
  4. Cree un nuevo método en la clase Program denominada CalculateDiscountUsingCodeWorkflow 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);
    }
    
    Ee264174.note(es-es,VS.100).gifNota:
    Las propiedades Subtotal, DiscountPercent y Total de la actividad DiscountCalculator 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 de Subtotal fluyen hasta la actividad Interop y tanto DiscountPercent como Total 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 nombres DiscountPercentOut y TotalOut para indicar que representan argumentos Out. El tipo DiscountCalculator se especifica como ActivityType de la actividad Interop.

  5. 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 actividad DiscountCalculator.

    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

  1. Haga clic con el botón secundario en Workflow1.xaml en el Explorador de soluciones y seleccione Eliminar. Haga clic en Aceptar para confirmar

  2. Haga clic con el botón secundario en PolicyInteropHost en el Explorador de soluciones y seleccione Agregar, Nuevo elemento.

  3. Expanda el nodo Elementos de Visual C# y seleccione Flujo de trabajo. Seleccione Actividad en la lista Elementos de Visual C#.

  4. Escriba DiscountWorkflow en el cuadro Nombre y haga clic en Agregar.

  5. 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.

  6. Haga clic en Crear argumento.

  7. 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.

    Ee264174.note(es-es,VS.100).gifNota:
    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.

  8. Haga clic en Crear argumento.

  9. 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.

  10. Haga clic en Crear argumento.

  11. 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.

  12. Haga clic en el botón Argumentos en el lado inferior izquierdo del diseñador de flujo de trabajo para cerrar el recuadro Argumentos.

  13. 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.

  14. Arrastre una actividad Interop de la sección Migración del cuadro de herramientas y colóquela en la actividad Sequence.

  15. 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.

    Ee264174.note(es-es,VS.100).gifNota:
    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 actividad DiscountCalculator. 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.

  16. Escriba DiscountPercent en el cuadro Escriba una expresión de VB a la derecha de la propiedad DiscountPercentOut y presione TAB.

  17. Escriba Subtotal en el cuadro Escriba una expresión de VB a la derecha de la propiedad Subtotal y presione TAB.

  18. Escriba Total en el cuadro Escriba una expresión de VB a la derecha de la propiedad TotalOut y presione TAB.

  19. Haga clic con el botón secundario en Program.cs en el Explorador de soluciones y seleccione Ver código.

  20. Agregue la instrucción using siguiente en la parte superior del archivo.

    using System.Collections.Generic;
    
  21. Ponga un comentario sobre la llamada al método CalculateDiscountInCode en el método Main y agregue el siguiente código.

    Ee264174.note(es-es,VS.100).gifNota:
    Si no siguiera el procedimiento anterior y el código Main predeterminado estuviera presente, reemplace el contenido de Main con el siguiente código.

    static void Main(string[] args)
    {
        CalculateDiscountUsingDesignerWorkflow();
        //CalculateDiscountUsingCodeWorkflow();
    }
    
  22. Cree un nuevo método en la clase Program denominada CalculateDiscountUsingDesignerWorkflow 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"]);
    }
    
  23. Presione CTRL+F5 para compilar y ejecutar la aplicación. Para especificar un importe de Subtotal distinto, cambie el valor de SubtotalValue 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

Evaluación de reglas en RuleSets

Encadenamiento de reglas

Control de encadenamiento delantero y Encadenamiento delantero de reglas

Procesamiento de colecciones en 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.