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.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *