Rodrigo Díaz Concha

.NET, Technology, Music, Art, Culture, Traveling, Fun...

Reglas en Workflow Foundation

Reglas en Workflow Foundation

En la mayoría de las aplicaciones –si no es que en todas- nosotros como programadores necesitamos implementar de un momento a otro flujos de trabajo que controlen el buen comportamiento y operación de nuestras aplicaciones. Workflow Foundation es una tecnología que nos permite definir e implementar flujos de trabajo para nuestras aplicaciones de una manera sencilla y sin necesidad de escribir cuantiosas líneas de código, ya que esta tecnología encapsula en sí misma diversas funcionalidades necesarias para la ejecución y control de dichos flujos. Tal es el caso del motor de Reglas, las cuales son un mecanismo que nos permite definir acciones a tomar según el resultado de la evaluación de las condiciones que se especifiquen al crearla. Esta característica nos permite implementar fácilmente en nuestras aplicaciones reglas reales de negocio para que posteriormente puedan ser evaluadas y que estas controlen el flujo que deba llevar la ejecución de la aplicación. Incluso, podemos utilizar el motor de Reglas en nuestras aplicaciones sin necesidad de usar un flujo de trabajo como tal.

Anteriormente para implementar reglas de negocio en nuestras aplicaciones era necesario escribir un sinnúmero de líneas de código para escribir funciones de control haciendo uso de condiciones y operadores lógicos o aritméticos que el lenguaje de programación nos ofrecía, es decir, lo hacíamos de manera imperativa. No obstante, la implementación de reglas y flujos de trabajo siempre ha sido una verdadera necesidad al crear aplicaciones, pero, ¿qué pasaba cuando nuestra aplicación crecía en número de funcionalidades o en usuarios, sin mencionar: en número de reglas de negocio? El mantenimiento y administración de las aplicaciones y de esas reglas se volvía difícil y con posibilidades de que en cualquier momento ocurriera algún tipo de falla ya que las reglas comúnmente estaban implementadas en el código de la aplicación y cualquier cambio provocaba que se recompilara alguna de las bibliotecas del programa. Ahora, Workflow Foundation nos ofrece una plataforma estándar para implementar dicha funcionalidad pero de manera declarativa.

Podemos definir como "declarativa" a la manera de crear reglas de forma desacoplada a nuestra aplicación, siguiendo la sintaxis y el esquema que define Workflow Foundation usando XAML.

Ejemplos de Reglas

Como mencionamos anteriormente, la necesidad de incorporar reglas de negocio a nuestras aplicaciones es inherente a nuestro trabajo como programadores. Como ejemplos de aplicaciones que usen reglas de negocio podemos mencionar una aplicación de tipo Call Center de alguna empresa de servicios en dónde se tienen que evaluar diversos factores antes de efectivamente dar de alta un pedido para un cliente en específico: Que el cliente no tenga adeudos, o si el cliente tiene adeudos pero si su comportamiento crediticio es bueno entonces proceder a dar de alta su pedido, la disponibilidad de la empresa para otorgar ese producto o servicio basándose en horario, posición geográfica del cliente, inventario, etc. Como podemos deducir hay una infinidad de ejemplos de aplicaciones y de reglas de negocio únicamente estando limitados a nuestra imaginación.

Creación de Reglas en Workflow Foundation

Las reglas en Workflow Foundation se utilizan en actividades con expresiones condicionales y en las políticas. Por el momento nos centraremos brevemente en la primera opción y más adelante platicaremos acerca de las políticas. Como actividades con expresiones condicionales podemos mencionar IfElse, ConditionedActivityGroup, While y Replicator.

Manos a la obra. Comencemos creando un proyecto de tipo flujo de trabajo secuencial de consola utilizando la plantilla Secuential Workflow Console Application en Visual Studio .NET. En este proyecto implementaremos la actividad IfElse como actividad inicial tal como lo muestra la figura 1.

 

La actividad IfElse requiere que le asignemos la condición que evaluará para determinar si es verdadera o falsa y si se ejecuta la rama izquierda o derecha respectivamente. Para hacer esto seleccionemos la actividad IfElseBranchActivity1 en el diseñador y asignemos la propiedad Condition en la ventana de propiedades (si la ventana de propiedades no es visible en este momento selecciónela del menú View->Properties Window). Si expandimos la lista desplegable de la propiedad Condition se nos presentan dos opciones: Code Condition y Declarative Rule Condition tal y como lo muestra la figura 2.

 

La primera opción nos permite especificar el nombre de un método que deseemos que sirva como expresión condicional. Asimismo, la segunda opción nos permite definir una regla de manera declarativa que sirva como expresión condicional. Al seleccionar la opción Declarative Rule Condition se nos presentan dos nuevas opciones en la ventana de propiedades: Condition Name y Expression. Condition Name es la propiedad por la cual accedemos al editor de reglas cuando hacemos clic en el botón marcado con "…". Al hacer clic en este botón se nos presenta la caja de diálogo Select Condition tal y como lo muestra la figura 3.

 

 

Las reglas en Workflow Foundation son editadas por medio de la caja de diálogo Rule Condition Editor presente en Visual Studio .NET. Este diseñador nos ofrece una interfaz amigable en donde podemos crear y editar diversas reglas para nuestro flujo de trabajo. Para crear una nueva regla hagamos clic en el botón "New…" en la barra de botones en la caja de diálogo. En la caja de diálogo Rule Condition Editor tenemos la posibilidad de editar la expresión condicional que se evaluará en la regla. En este ejemplo, nuestra regla validará si el día actual es lunes así que la expresión será la siguiente:

System.DateTime.Now.DayOfWeek == System.DayOfWeek.Monday

Una vez finalizada la definición de la expresión para nuestra regla hagamos clic en el botón OK para regresar a la caja de diálogo anterior (Select Condition) y ahí hagamos también clic en el botón OK.

Cuando creamos reglas usando el diseñador en Visual Studio .NET, estas son escritas en un archivo llamado [Flujo de trabajo].rules, siendo [Flujo de trabajo] el nombre del flujo de trabajo que estamos utilizando en ese momento. Si abrimos este archivo para inspeccionar su contenido podremos corroborar que efectivamente la regla está implementada declarativamente por medio de XAML. La figura 4 muestra el contenido de este archivo.

 

 

Asimismo, una vez compilado nuestro proyecto podemos observar que el archivo es compilado como un recurso en el ensamblado que contiene el flujo de trabajo tal y como lo podemos corroborar en la figura 5, la cual muestra el manifiesto de nuestra aplicación WorkflowConsoleApplication1.exe en la herramienta ILDASM.exe

 

 

Ahora bien, aún nuestra aplicación no está finalizada ya que no se ha definido el código que deseemos que se ejecute cuando la expresión de la regla se evalúe verdadera o falsa. Para corregir esto agreguemos una actividad de tipo Code en cada una de las ramificaciones de la actividad IfElse usando el diseñador en Visual Studio .NET. La figura 6 muestra nuestro flujo de trabajo con dichas actividades incorporadas.

 

Las actividades codeActivity1 y codeActivity2 requieren que se les asigne el método que van a ejecutar cuando estas sean llamadas cuando la regla se evalúe como verdadera y como falsa respectivamente. Para realizar esto hagamos primero clic en la actividad codeActivity1 para mostrar sus propiedades relacionadas en la ventana de propiedades de Visual Studio .NET (si la ventana de propiedades no es visible en este momento puede mostrarla haciendo clic en el menú View->Properties Window). En la propiedad ExecuteCode en la ventana de propiedades escribamos EsLunes. Al hacer [Enter] Visual Studio .NET nos muestra la vista de código fuente de nuestro flujo de trabajo con el cuerpo del método EsLunes() implementado. Para este ejemplo escribamos el siguiente fragmento de código:

Console.WriteLine("Es lunes!");

Hagamos doble clic en el archivo Workflow1.cs en la ventana de Solution Explorer para regresar al diseñador de nuestro flujo de trabajo y repitamos las mismas acciones pero ahora con codeActivity2, la única diferencia radicará en que el nombre del método para codeActivity2 será NoEsLunes; de esta manera Visual Studio .NET generará el método NoEsLunes() como parte del código fuente en Workflow1.cs. Ya que este método se ejecuta cuando la evaluación de la regla esa falsa entonces el código para el método NoEsLunes() es la siguiente:

Console.WriteLine("No es lunes");

Entonces tenemos que los dos métodos completos fueron implementados de la siguiente manera:

private void EsLunes(object sender, EventArgs e)
{
    Console.WriteLine("Es lunes!");
}
 
private void NoEsLunes(object sender, EventArgs e)
{
    Console.WriteLine("No es lunes");
}

Listo. Hemos diseñado una regla utilizando el diseñador incorporado a Visual Studio .NET y esa regla la hemos incorporado como expresión condicional a una actividad dentro de un flujo de trabajo. Para corroborar que todo hasta el momento funciona como debe ser podemos compilar nuestro proyecto usando la opción Build Solution en el menú Build. Una vez compilado el proyecto podemos ejecutarlo haciendo click en la opción Start Without Debugging del menú Debug o con la combinación de teclas Ctrl+F5. Si el día en el que se está ejecutando este código efectivamente es lunes la aplicación mostrará el siguiente resultado en la consola:

 

 

De lo contrario, mostrará la consola con el mensaje implementado en el método NoEsLunes() indicado anteriormente.

Resumen

En este artículo hablamos acerca del motor de Reglas incorporado en Workflow Foundation, dimos algunos ejemplos de reglas de negocio reales en aplicaciones y detallamos la manera de creación de reglas en Workflow Foundation utilizando Visual Studio .NET. En secciones posteriores veremos más acerca de las reglas y su utilización por medio de políticas.

Este artículo fue creado para el curso Desarrollador .NET de la revista Users.  http://desarrollador.redusers.com/

Comments

MVPs en Latinoamerica said:

Miguel Angel Moran nos comparte este excelente recurso, donde podrán encontrar: Introducción

# February 13, 2008 10:10 AM

Noticias externas said:

Miguel Angel Moran nos comparte este excelente recurso, donde podrán encontrar: Introducción a Workflow

# February 13, 2008 11:10 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Protected by FormShield
Refresh
Listen
Please enter the characters shown on the image


Code: