4.03.2011

Programación Imperativa en Workflow Foundation 4.0

Es sorprendente la cantidad de nuevas características que tiene el nuevo Windows Workflow Foundation para desarrollar workflows para nuestras aplicaciones de negocios. Una de las más impresionantes es la capacidad de crear código imperativo. Esto nos permite crear workflows y flujos de trabajo de forma dinámica y ejecutarlos de forma dinámica. Por ejemplo, supongamos que queremos un simple workflow que va a escribir dos textos enviados por parámetro al método que lo crea y lo ejecuta. Si lo quisiéramos hacer sin usar código imperativo simplemente escribiríamos una función como esta:

private static void EscribirEnConsola(string p, string p_2)
{
Console.WriteLine(p);
Console.WriteLine(p_2);
}

Ahora, si queremos crearlo utilizando las capacidades de código imperativo de WF4, escribiríamos un código un poco más grande pero más dinámico ya que se basa en actividades y no en instrucciones. Primero vamos a tener que agregar referencia a un dll llamado System.Activities. Seguidamente agregamos a los using las siguientes instrucciones

using System.Activities;
using System.Activities.Statements;

Ahora ya podemos programar de forma imperativa.

private static void EscribirAConsolaConWF(string p, string p_2)
{
var s = new Sequence
{
Activities = {
new WriteLine{ Text = p},
new WriteLine{ Text = p_2}
}
};
WorkflowInvoker.Invoke(s);
}

Como podemos ver en el código anterior, primero recibimos el texto que debemos escribir al dispositivo de salida configurado, luego creamos una secuencia de actividades y por último dentro de la secuencia, creamos dos actividades para escribir el Texto que nos envían por parámetro. Ahora, la pregunta que nos viene es: ¿y qué ventajas tengo con este tipo de programación? y la respuesta es obviamente muchas; por ejemplo, supongamos que las actividades anteriores no las queremos ejecutar de forma secuencial si no de forma paralela. Para esto, simplemente cambiamos la estructura del workflow de sequence a Parallel y ahora no vamos a crear actividades si no más bien Branches que se van a ejecutar de forma paralela.

private static void EscribiriAConsolaConWFParalelo(string p1, string p2)
{
var s = new Parallel
{
Branches =
{
new WriteLine{ Text = p1},
new WriteLine{ Text = p2},
new WriteLine{ Text = "Paralelo"}
}
};
WorkflowInvoker.Invoke(s);
}

Todo el soporte para el manejo de memoria y threads en el código anterior lo hace el runtime de WF4 y nosotros nos despreocupamos de la necesidad de programar muchas cosas que son carpintería y no tienen nada que ver con la lógica de negocios que queremos construir.


Etiquetas de Technorati:

No hay comentarios: