9.30.2011

Aprendiendo WF parte 1

Una de las tecnologías que más utilizo y más me gusta de .NET es quizás una de las más subutilizadas es el Workflow Foundation. Por esta razón he decidido hacer una serie de post referente a esta tecnología con el fin de incentivar el uso de tan potente framework.

Introducción

El workflow foundation es un framework que nos permite diagramar procesos de negocio para orquestar componentes de negocio con lo cual podemos obtener una serie de beneficios tanto desde el punto de vista técnico como desde el punto de vista negocio. Entre los beneficios técnicos tenemos:

  • Los procesos gráficos son más simples de mantener.
  • Dado que el runtime del WF maneja mucho de las complejidades del framework es más simple aprovecharse de bondades tales como el paralelismo.
  • La facilidad para implementar servicios WFC a través de WF.

Entre lo más destacado desde el punto de vista negocios podemos mencionar:

  • Los analistas de negocio pueden participar más activamente de la definición y desarrollo del proceso
  • Los cambios a los procesos salen a producción más rápidamente.
  • Al exponer los procesos como servicios, permite que los mismos analistas de negocios estén conscientes de la posibilidad de reutilizar procesos de negocios ya existentes para crear nuevos procesos.

Desarrollando el primer workflow en WF

Los workflows de negocio están compuestos por actividades las cuales tiene diversas funcionalidades. Estas actividades en workflow foundation se representan tanto gráficamente como a través del código. En este primero post vamos a crear un workflow muy simple utilizando ambas presentaciones.

WF a través del diseñador

Para desarrollar nuestro primero ejemplo, vamos a crear una aplicación de consola del tipo workflow.

image

Ya en el workflow simplemente vamos a crear un flujo que simplemente escribe una hilera en la consola –> el típico hola mundo. El workflow se puede ver a continuación:

image

Este workflow simplemente tiene dos formas, una secuencia – que para este caso podría no ser necesaria ya que funciona como un contenedor secuencial de formas y en realidad la primitiva WriteLine podría funcionar sin la secuencia. Si ejecutamos este workflow el resultado se ve en la siguiente pantalla.

image

¿Y como funciona este workflow? En realidad toda la “magia” esta en el archivo program que se genera cuando creamos el proyecto, el cual vemos a continuación:

image

En el método Main, se invoca una nueva instancia del tipo Workflow1, la cual es la clase que representa nuestro workflow gráfico.

WF a través de código

Ahora vamos a construir el mismo workflow pero por código. Para esto vamos a hacer un proyecto de consola pero de los que normalmente hacemos para los ejemplos en el blog.

image

Como tenemos un proyecto normal de aplicación de consola, debemos agregar el assembly que contiene las actividades que pueden llegar a formar parte de nuestro workflow, incluso nuestro workflow es una actividad. Para esto procedemos a agregar una referencia a la librería System.Activities.

image

Ahora vamos a crear una clase que represente un workflow por código que simplemente escriba tal y como lo hicimos en el workflow gráfico el típico saludo de “Hola Mundo”. Esta clase la vamos a llamar WFSaludo y se presenta a continuación.

image

Para que la clase nos compile debemos agregar referencia a las siguientes librerías – si usan R#, la herramienta se las sugiere automáticamente:

image

Ahora vamos a invocar el workflow desde el método Main, tal y como lo hicimos con el workflow gráfico.

image

El resultado de ejecutar este workflow es el mismo que el anterior y se presenta a continuación.

image

 

Etiquetas de Technorati: ,

9.21.2011

Concurrencia y el Entity Framework – Parte 2

Continuando con el post anterior vamos a dar las soluciones que están al alcance de los que desarrollamos aplicaciones usando el Entity Framework. En este post (2 / 3 ) vamos a utilizar los timestamps para identificar si una columna ha cambiado.

Agregar columna timestamp

Inicialmente vamos a agregar una propiedad para tracking dentro de la entidad Consultor, esta propiedad será de tipo Byte[] y utilizará una anotación –> atributo <— del namespace del Entity Framework que le servirá para reconocer que esta columna debe ser parte de las sentencias Update y Delete en la parte del Where.

image

Hay que destacar que la base de datos original debemos eliminarla para que se recree de nuevo o modificarle la tabla consultor para que soporte el nuevo campo agregado. Si la opción es esto ultimo el campo a agregar debe lucir como el siguiente:

image

Ahora vamos a proceder a modificar el método Edit –> [HttpPost] del controller de Consultor.

image

Como podemos ver en el código anterior, tenemos que atrapar una excepción específica para saber si hubo un problema de concurrencia con el registro que estamos trabajando. El mensaje de error se agrega al ModelState y la llave del error se deja en blanco, lo que provoca que cuando se solicite de nuevo la vista actual con la tipificación del consultor, el mensaje de error se despliegue en la página – se puede encontrar más información acerca del ModelState en este link.

Tenemos también que agregar la nueva propiedad a la vista de edición del Consultor, en esto lo hacemos agregando un hidden field seguido del campo del Id.

image

Ahora si intentamos modificar un registro que ya fue modificado posteriormente a nuestra consulta, veremos el error de concurrencia aparecer en nuestra página.

Por ejemplo, si estamos editando el registro y queremos cambiarlo como se ve en la figura siguiente:

image

Pero otro usuario desde otro navegador hace el cambio y lo refleja en la base de datos antes de que yo haga el “submit” del mío:

image

Cuando yo intente modificar el registro en la base de datos, voy a recibir el siguiente error:

image

Etiquetas de Technorati: ,