Workflows, Manos a la obra…

Creación de un WorkFlow con parámetros y devolución de información


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

Entradas más populares de este blog

Modelando relaciones en UML, un acercamiento a las Asociaciones

Utilizando Intents implícitos para crear actividades

Secuencias…Modelado indispensable