Si le echaron un vistazo
al mapa, se habrán dado cuenta de los 3 conceptos principales que hay que entender: host, actividades y workflow.
En esta entrada, hablaré un poco sobre el primero:
¿qué se necesita para que mi aplicación pueda utilizar Windows Workflow Foundation?Muy sencillo: la aplicación debe tener la capacidad de ser el anfitrión (host) para el ambiente de ejecución de los workflows.
Ahora, en la vida real, ser un buen anfitrión pudiera requerir de mucho dinero o amigos--después de todo, hay que tener chelas en la casa para cuando caen los compas, y tener listos los teléfonos de las amigas teiboleras en caso de una fiesta de emergencia, ya saben... digo... ejem... ¿En qué estaba? Ah si, hablando de una aplicación de .NET en realidad solo necesitas hacer 2 cosas:
- Crear el ambiente de ejecución de workflow (runtime engine)
- Instanciar y arrancar el workflow
// asumiendo que se tienen referencias a los
// siguientes assemblies:
//
// System.Workflow.Activities,
// System.Workflow.ComponentModel y
// System.Workflow.Runtime
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace WorkflowApplication
{ class MyProgram
{ static void Main(string[] args)
{ // crear el ambiente de ejecución de para
// los workflows (runtime)
WorkflowRuntime runtime = new WorkflowRuntime();
// TODO:
// agregar servicios y/o suscribirse a
// eventos del runtime antes de arrancar
// la ejecución del workflow
// instanciar e iniciar la ejecución del workflow.
// en este caso, "MyWorflow" es el nombre
// de la clase que representa mi workflow
WorkflowInstance instance =
runtime.CreateWorkflow(typeof(MyWorkflow));
instance.Start();
// no olvidar destruir el runtime cuando
// ya no se necesite!
}
}
}
Y eso es todo. Esto implica que cualquier "ejecutable" de .NET puede ser un anfitrión--desde una vulgar aplicación de consola, como en el ejemplo, hasta una aplicación de Windows Forms o incluso ASP.NET.
El runtime correrá dentro del proceso de tu ejecutable. El runtime sigue el
patrón sigleton, por lo que solo se permite una instancia del runtime por aplicación.
Ahora, hay algo que sí hay que cuidar desde un inicio: el threading. Sobretodo en ASP.NET, es importante, ya que el runtime tomará "prestado" el thread de ejecución de la aplicación. De eso platicamos luego, en otra entrada...
Por default, los workflows son iniciados de manera asíncrona por el runtime, así que tendrás que tomar medidas para asegurar que la aplicación host no termine antes de que tu workflow. Esto se hace con algunas de las clases de System.Threading, como en el siguiente ejemplo:
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace WorkflowApplication
{ class Program
{ static void Main(string[] args)
{ // crear el runtime
using (WorkflowRuntime runtime = new WorkflowRuntime())
{ AutoResetEvent waitHandle = new AutoResetEvent(false);
// estos son eventos del runtime a los cuales nos podemos
// "suscribir". en este caso se utilizan para señalar
// cuando el workflow terminó de ejecutarse
runtime.WorkflowCompleted +=
delegate(object sender, WorkflowCompletedEventArgs e)
{ waitHandle.Set();
};
runtime.WorkflowTerminated +=
delegate(object sender, WorkflowTerminatedEventArgs e)
{ Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
// instanciar y arrancar el workflow
WorkflowInstance instance =
runtime.CreateWorkflow(typeof(MyWorkflow));
instance.Start();
// el thread se queda esperando hasta que reciba una señal
// debido a algún Set()
waitHandle.WaitOne();
}
}
}
}