VS 2010 & .NET Fx 4.0: Novedades en WF 4.0 (III)!

Siguiendo con la serie de post en torno a las novedades de Windows Workflow Foundation 4.0 (WF 4.0, puedes leer también las partes I y II), en esta ocasión voy a tratar sobre lo fácil que resulta definir argumentos y variables en Visual Studio 2010 para poder comunicarnos con un workflow de WF 4.0. Empecemos.

Diseñando el workflow

Como siempre, lo primero que vamos a hacer es diseñar el workflow de WF 4.0 con Visual Studio 2010:

  • Iniciamos Visual Studio 2010 y creamos un proyecto de workflow (de tipo secuencial).
  • En el diseñador de workflows, arrastramos una actividad de tipo Assign a la superficie de diseño.
  • Para crear argumentos y variables en un workflow de WF 4.0, disponemos en el diseñador de dos botones que nos permiten añadirlos de forma muy sencilla.
  • Por ejemplo, para añadir argumentos basta con pulsar el botón Arguments y añadir los argumentos que necesitemos. Estos pueden ser de entrada o de salida. En nuestro caso, crearemos un argumento de entrada y otro de salida.
  • A continuación, configuramos la propiedad To de la actividad Assign añadiéndole uno de estos argumentos que acabamos de crear utilizando para ello el editor de expresiones (os recuerdo que dicho editor usa sintaxis VB.NET).
image image image
  • Seguimos el mismo procedimiento para configurar la propiedad Value de la actividad Assign.

image

Codificando la gestión de los argumentos

Una vez que hemos definido los argumentos de entrada y salida del workflow, ya solo nos falta definir las clases de gestión correspondientes:

  • Clase para el argumento de entrada, en la que simplemente definiremos un constructor en el que añadimos la propiedad de entrada del workflow:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text; 

namespace WFActivitiesDemo

{

    public class SayHelloInArgs: Dictionary<string,object>

    {

        public SayHelloInArgs(string name)

        {

            this.Add("Name", name);

        }

    }

}

  • Clase para el argumento de salida, un poco más compleja que la anterior ya que tenemos que realizar la asignación del valor de la propiedad. Fijaros también que en este caso el constructor de la clase es un tipo complejo frente al caso del argumento de entrada.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text; 

namespace WFActivitiesDemo

{

    class SayHelloOutArgs

    {

        IDictionary<string, object> _outArgs = null;

        public SayHelloOutArgs(IDictionary<string, object> outArgs)

        {

            if (outArgs == null)

            {

                throw new ArgumentNullException("outArgs");

            }

            _outArgs = outArgs;

        }

        public string Greeting

        {

            get

            {

                return _outArgs["Greeting"].ToString();

            }

        }

    }

}

Probando el workflow

Una vez que hemos definido las clases de gestión de los argumentos de entrada y salida, solo nos queda probar el workflow. Para ello:

  • Modificamos Program.cs para que por una parte recoja la entrada de usuario en el argumento de entrada definido y por otra genere la salida definida y en la que se utiliza el argumento de salida.

namespace WFActivitiesDemo

{

    using System;

    using System.Linq;

    using System.Threading;

    using System.Activities;

    using System.Activities.Statements;  

    class Program

    {

        static void Main(string[] args)

        {

            AutoResetEvent syncEvent = new AutoResetEvent(false);  

            Console.Write("Introduce tu nombre: ");

            string name = Console.ReadLine();

            string greeting=null;

            WorkflowInstance myInstance = new WorkflowInstance(new Sequence1(),

                new SayHelloInArgs(name));

            myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e)

            {

                SayHelloOutArgs outArgs =

                    new SayHelloOutArgs(e.Outputs);

                greeting = outArgs.Greeting;  

                syncEvent.Set();

            };

            myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)

            {

                Console.WriteLine(e.UnhandledException.ToString());

                return UnhandledExceptionAction.Terminate;

            };

            myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)

            {

                Console.WriteLine(e.Reason);

                syncEvent.Set();

            };

             myInstance.Run();  

            syncEvent.WaitOne();  

            Console.WriteLine(greeting);

            Console.ReadLine();  

        }

    }

}

 
Finalmente, el resultado de ejecución del workflow es el siguiente:
image

Y hasta aquí llega la tercera entrega sobre novedades en WF 4.0. Espero que el post os haya resultado interesante.