Workflows, Manos a la obra…
Objetivo
La idea del siguiente artículo es recrear un escenario donde pongamos en funcionamiento la tecnología básica de un flujo de trabajo para pasarle parámetros y luego obtener una retroalimentación de esas actividades realizadas.
Caso de Trabajo
El caso consiste en controlar un código postal, demás está aclarar que voy a trabajar sobre un esquema muy simple de actividades como el nombrado ya que la idea es explicar los pasos a seguir en la operación.
Código
En primer lugar vamos a crear una librería de workflow, para ello tenemos que agregar un Nuevo proyecto a nuestra solución:
Para mi caso, una librería secuencial.
Posteriormente voy a crear mi flujo de trabajo, a este lo denominé "WorkflowDemoGeneral", veamos cual es su diseño:
Para este diseño agregué una decisión y dos actividades de código, para las tres opciones he utilizado las reglas de código para colocar funcionalidad.
En primer lugar para la decisión 1:
Como vemos en la figura anterior "Code condition" y llamando al método "EvaluarCodigoPostal"
En segundo lugar para la condición 2:
En este caso llamo al mismo método de manejo de la evaluación, veamos que tiene este método manejado:
///
<summary>
/// Desempeña el rol de evaluar un codigo postal valido, podemo usar exp. regulares
/// Para el ejemplo evalua la cadena y si tiene mas de 3 c, acepta.
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void EvaluarCodigoPostal(object sender, ConditionalEventArgs e)
{
if (codigo.Length > 3)
{
e.Result = true;
}
else
{
e.Result = false;
}
}
Como vemos, el método se encarga solamente de definir si el código cadena tiene más de 3 caracteres el resultado es true y pasa por un esquema de código o de la otra forma pasa por el false.
Ahora como les había diagramado cada uno de los caminos tiene actividades de código, veamos su implementación:
Esta figura corresponde a la actividad, donde lo importante a remarcar es el método llamado "codigoPostalValido".
Veamos la actividad 2:
Como vemos el método de llamada es diferente.
Ahora veamos cual es mi objetivo para estos dos métodos:
///
<summary>
/// Se encarga de realizar las operaciones si el codigo postal es válido
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void codigoPostalValido(object sender, EventArgs e)
{
//Valido.
Valido = true;
}
///
<summary>
/// Se encarga de realizar las operaciones si el codigo postal no es válido
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void CodigoInvalido(object sender, EventArgs e)
{
// No Válido
Valido = false;
}
Como vemos en el código anterior la ejecución de cada uno de los métodos está determinando una propiedad del flujo.
El objetivo es declarar esta como parámetro de salida:
#region Valores de Salida
private
Boolean valido = false;
public
Boolean Valido
{
get { return valido; }
set { valido = value; }
}
#endregion
Bien en este punto tengo listo mi flujo de trabajo, lo que resta es declarar un page aspx y consumir el mismo.
Les muestro el diseño y la idea de la prueba:
Como vemos vamos a tener una caja de texto donde ingresamos el código que le vamos a pasar a nuestro workflow y el inicio lo determina el click de botón una vez finalizado el tratamiento del flujo tomaremos el valor del flujo con el parámetro de salida para colocar en la etiqueta si el resultado es positivo o negativo.
Veamos el code del botón:
protected
void btnEjecutar_Click(object sender, EventArgs e)
{
//Instancia del flujo
workflowRuntime = new
WorkflowRuntime();
//Manejadores de eventos
workflowRuntime.WorkflowCompleted += new
EventHandler<WorkflowCompletedEventArgs>(OnWorkflowCompleted);
workflowRuntime.WorkflowTerminated += new
EventHandler<WorkflowTerminatedEventArgs>(OnWorkflowTerminated);
//Parámetros
Dictionary<string, object> parameters = new
Dictionary<string, object>();
parameters.Add("CodigoPostal",TextBox1.Text);
Type type = typeof(WorkflowLibraryDemo.WorkflowDemoGeneral);
//Inicio del Flujo
workflowRuntime.CreateWorkflow(type, parameters).Start();
waitHandle.WaitOne();
//Fin del Flujo
workflowRuntime.StopRuntime();
}
Veamos los eventos:
///
<summary>
/// Al completar el flujo
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void OnWorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
string val = e.OutputParameters["Valido"].ToString();
Label1.Text = val;
waitHandle.Set();
}
///
<summary>
/// Al terminar de forma inesperada el flujo
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void OnWorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
Label2.Text = "El Flujo ha Terminado inesperadamente";
waitHandle.Set();
}
Veamos el código completo de la page:
public
partial
class
ConsumirFlujos : System.Web.UI.Page
{
WorkflowRuntime workflowRuntime;
static
AutoResetEvent waitHandle = new
AutoResetEvent(false);
protected
void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//no implementado
}
}
protected
void btnEjecutar_Click(object sender, EventArgs e)
{
//Instancia del flujo
workflowRuntime = new
WorkflowRuntime();
//Manejadores de eventos
workflowRuntime.WorkflowCompleted += new
EventHandler<WorkflowCompletedEventArgs>(OnWorkflowCompleted);
workflowRuntime.WorkflowTerminated += new
EventHandler<WorkflowTerminatedEventArgs>(OnWorkflowTerminated);
//Parámetros
Dictionary<string, object> parameters = new
Dictionary<string, object>();
parameters.Add("CodigoPostal",TextBox1.Text);
Type type = typeof(WorkflowLibraryDemo.WorkflowDemoGeneral);
//Inicio del Flujo
workflowRuntime.CreateWorkflow(type, parameters).Start();
waitHandle.WaitOne();
//Fin del Flujo
workflowRuntime.StopRuntime();
}
///
<summary>
/// Al completar el flujo
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void OnWorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
string val = e.OutputParameters["Valido"].ToString();
Label1.Text = val;
waitHandle.Set();
}
///
<summary>
/// Al terminar de forma inesperada el flujo
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void OnWorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
Label2.Text = "El Flujo ha Terminado inesperadamente";
waitHandle.Set();
}
}
Al ejecutar la pagina deberíamos encontrar el funcionamiento deseado, si ingresamos un código de más de 3 caracteres es TRUE de lo contrario es FALSE
Caso correcto
Caso incorrecto
Espero les sea de utilidad….
Comentarios
Publicar un comentario