Consumiendo Servicios Web en Workflow Foundation

Consumiendo Web Services en Workflow Foundation

Hasta este momento hemos visto y explicado una gran cantidad de funcionalidad de Workflow Foundation implementada en varias actividades que vienen incluidas, y en este capítulo explicaremos una más: la actividad InvokeWebService la cual nos permite realizar la invocación a un servicio Web XML y de esa manera extender la funcionalidad de nuestros flujos de trabajo.

Si bien está fuera de alcance en este capítulo explicar a detalle el funcionamiento de los servicios Web, debemos recordar que son componentes implementados en servidores Web y que exponen una serie de funcionalidades que podemos utilizar y reutilizar en nuestras aplicaciones que desarrollemos.

Para demostrar lo fácil que es consumir servicios Web desde nuestros flujos de trabajo en Workflow Foundation, iniciemos abriendo Visual Studio .NET y creemos una nueva aplicación de consola de flujo de trabajo secuencial. Esto lo logramos seleccionado la plantilla “Sequential Workflow Console Application” en la ventana de New Project de Visual Studio .NET. A esta solución le pondremos el nombre de ConsumiendoWebServices tal y como lo muestra la siguiente figura:

A nuestro proyecto le agregaremos un nuevo sitio Web de tipo ASP.NET Web Service y le pondremos el nombre WSPrueba. Este será el sitio en donde desarrollaremos un servicio Web de prueba para demostrar la invocación desde un flujo de trabajo. Cuando creamos un proyecto de este tipo automáticamente Visual Studio .NET agrega un servicio Web llamado Service.asmx y su archivo de code-behind relacionado Service.asmx.cs. Nuestro servicio Web tendrá un método público que regresará el día de la semana actual, para esto necesitamos implementar el siguiente código:

Recordemos que aquellos métodos que deseamos invocar a través del servicio Web deberán estar decorados con el atributo WebMethod y tener el modificador de acceso public

Ahora bien, en el diseñador de nuestro flujo de trabajo agreguemos una actividad de tipo InvokeWebService. Al hacer esto Visual Studio .NET automáticamente nos presenta la caja de diálogo Add Web Reference –la misma que se muestra al agregar una referencia Web en cualquier tipo de proyecto-. El objetivo de esta caja de diálogo es indicar cuál es el servicio Web que deseamos invocar por medio de la actividada InvokeWebService. En nuestro caso seleccionaremos “Web Services in this solution” ya que esta opción buscará los servicios Web implementados en la misma solución. Una vez seleccionada esta opción, la caja de diálogo nos muestra una lista con los servicios Web encontrados y posteriormente seleccionaremos el servicio llamado “Service” el cual es el que creamos en los párrafos anteriores. Al hacer clic en este servicio, la caja de diálogo nos muestra su detalle completo. La siguiente figura muestra la caja de diálogo desplegando el detalle de Service.asmx:

Hagamos clic en el botón Add Reference. Como es esperado, Visual Studio .NET agrega al proyecto de nuestro flujo de trabajo la referencia Web correspondiente al servicio seleccionado. Además de lo anterior la actividad InvokeWebService es mostrada en el diseñador. No obstante, a este momento aún no hemos configurado dicha actividad, lo cual requiere establecer la propiedad MethodName que indica el método del servicio Web que se va a ejecutar. En la ventana de propiedades MethodName se muestra como una lista desplegable, la cual al hacer clic sobre ella muestra la lista de todos los métodos disponibles en el servicio. En nuestro caso seleccionaremos RegresaDiaDeLaSemana. Al seleccionar dicho método la ventana de propiedades es actualizada mostrando una nueva propiedad llamada (ReturnValue). Esta propiedad nos permite mapear el valor de retorno del método a alguna propiedad o campo dentro de nuestro flujo de trabajo; esto lo podemos lograr al hacer clic en el botón de tres puntos “…” en la propiedad (ReturnValue) y configurar el mapeo, en nuestro caso, a un campo llamado “resultado”. El mismo mecanismo de asignación es usado para cuando el método Web requiere parámetros. La siguiente figura muestra la actividad InvokeWebService configurada:

Muy bien, ahora para probar la invocación del servicio Web agreguemos una actividad de tipo Code al diseñador del flujo de trabajo. A esta actividad le relacionaremos el método Consulta en su propiedad ExecuteCode tal y como lo muestra la siguiente figura:

El método Consulta tendrá el siguiente código, el cual muestra el resultado de la invocación de nuestro servicio Web:

Hemos finalizado. Para probar nuestro trabajo ejecutemos nuestra aplicación haciendo clic en Ctrl-F5 o haciendo clic en el menú Debug->Start Without Debugging. Dependiendo del día en el que se esté ejecutando el código, el resultado nos mostrará el día correcto de la semana tal y como lo podemos corroborar en la siguiente figura:

Creando un control de usuario reutilizable : El mapa de México en XAML en acción – Parte II

Esta es la continuación del artículo “Creando un control de usuario reutilizable : El mapa de México en XAML en acción – Parte I”.

Crear un control de usuario reutilizable en Silverlight 2 es una tarea muy sencilla y más si organizamos e identificamos bien los pasos a seguir.

Actualmente en nuestra solución de Silverlight tenemos varios archivos entre ellos Page.xaml y Mexico.xaml.  Page.xaml es el archivo que incluye por default la plantilla de proyectos Silverlight 2 para Visual Studio .NET 2008.  Este archivo representa una página en nuestra aplicación; podemos tener más de 1 página por proyecto no obstante la página que estaremos viendo en la aplicación es aquella que asignes en la propiedad RootVisual lo cual podemos comprobar si abrimos el archivo de code-behind App.xaml.cs:

El fragmento de código muestra el comportamiento predeterminado de una aplicación Silverlight 2: la aplicación mostrará una instancia de Page.xaml, la cual no es mas que una clase que extiende la clase base UserControl; esta instancia es asignada a la propiedad RootVisual de la aplicación y todos felices y contentos.

Ahora bien, queremos crear nuestro control del mapa de México como un control reutilizable para poder usarlo en Page.xaml, Page2.xaml o CualquierOtroArchivo.xaml.

El siguiente paso será importar el namespace del proyecto en la declaración del UserControl de Page.xaml, asignándole un alias (por ejemplo “mapas”) para poder nombrar las nuevas instancias del mapa de una manera sencilla:

Tenemos nuestra primer instancia del control de usuario en Page.xaml ! No obstante, el mapa del control de usuario tiene un tamaño superior al tamaño de Page.xaml.  Esto es fácilmente corregido si eliminamos las declaraciones fijas de tamaño que tiene Mexico.xaml (Width y Height) en los Canvas LayoutRoot y MapaMexico y en la declaración del UserControl.  Además es buen momento para quitar la declaración de color azul del Canvas MapaMexico para que el mapa sea totalmente transparente cuando lo coloquemos en una página:

Estos últimos pasos nos permitirán declarar el mapa de México como cualquier otro elemento o control de Silverlight 2.  La siguiente figura muestra cómo se dibuja el nuevo control de usuario en el diseñador de Visual Studio .NET 2008:

Ya que el mapa de México lo podemos tratar como cualquier otro elemento o control de Silverlight, apliquemos una transformación de escala (ScaleTransform) para manipular su tamaño y mostrarlo un poco mejor en la página:

Es buen momento para diseñar la página de nuestra aplicación (Page.xaml).  Al diseño agregaremos 2 columnas y 3 filas ya sea manualmente en el archivo Page.xaml o por medio de Expression Blend.  La primer fila nos servirá para colocar el título de la aplicación, la segunda para colocar el mapa de México y la tercera para indicar cuál estado ha sido seleccionado.

El siguiente fragmento de código muestra las modificaciones realizadas a Page.xaml y la figura la aplicación ejecutándose en el navegador:

Al ejecutar la aplicación nos damos cuenta que el mapa de México continúa sirviendo, pero aún necesitamos una manera de avisarle a la página Page.xaml que un estado ha sido seleccionado!  Esto lo haremos creando un evento en Mexico.xaml.cs.

Primeramente necesitamos definir una nueva clase de Argumentos.  Esta clase incluirá una propiedad llamada Estado la cual indicará qué estado ha sido seleccionado por el usuario:

Posteriormente un nuevo delegado que sea la base para el evento que estamos buscando disparar.  Este nuevo delegado usará dos parámetros: object y MexicoEventArgs; siendo el primero el objeto (instancia del mapa) que ha disparado el evento y el segundo los argumentos del evento.  Sin sorpresa alguna vemos que estoy usando MexicoEventArgs ya que precisamente usaremos su propiedad Estado para indicar el estado seleccionado.

Ahora bien, declaremos el evento dentro de la clase Mexico:  Este evento estará basado en MexicoEventHandler (el nuevo delegado):

Finalmente, vamos a disparar este evento en el clic de cada estado en vez de estar mostrando la ventana de alerta:

Este último fragmento de código  demuestra varias cosas:

  1. Estamos obteniendo el nombre del estado haciendo un cast a Canvas de la propiedad sender para determinar qué estado fue seleccionado y
  2. Estamos creando una nueva instancia de MexicoEventArgs a la cual le estaremos asignando en su propiedad Estado el nombre del estado obtenido del punto número 1.
  3. Estamos usando una nueva característica del .NET Framework 3.5 la cual es “Object Initializer” o “Inicializadores de Objectos”.  Con ella podemos en la misma línea de código establecer las propiedades públicas que necesitemos sin necesidad de contar con un constructor adecuado para ello.

Perfecto!  Por último, necesitamos “inscribirnos” al evento EstadoSeleccionado en Page.xaml, para poder establecer el texto del TextBlock tbEstado con el nombre del estado seleccionado:

Estamos usando una expresión Lambda, en vez de la declaración del método en el cuerpo de la clase.  Las expresiones Lambda son un tipo especial de Métodos Anónimos (concepto introducido desde la versión 2.0 del .NET Framework) y su sintaxis incluye el operador => que significa “se va a”.  Es notable cómo el compilador conoce de antemano el tipo de los parámetros de la expresión Lambda sin necesidad de explícitamente indicarlos (o es Object, args es MexicoEventArgs).

Listo!  Hemos creado nuestro primer control de usuario y lo hemos utilizado en Page.xaml. Si ejecutamos la aplicación podemos darnos que el comportamiento esperado es correcto:  al hacer clic en un estado del control de usuario mapaMexico, el TextBlock tbEstado cambia su texto correctamente: (la propiedad ShowGridLines del Grid en Page.xaml ha sido establecida a false en la siguiente figura)

Puedes descargar el código fuente de este artículo en la sección Contenido de la La Liga Silverlight en esta dirección.

En el siguiente artículo veremos cómo extender la funcionalidad de nuestra aplicación para crear un portal que muestre fotografías relacionadas con el estado seleccionado del control de usuario!

Creando un control de usuario reutilizable : El mapa de México en XAML en acción – Parte I

Hace algunas semanas creé el primer mapa de México en XAML.  Esta iniciativa animó a unos buenos amigos a perfeccionar esta primer aproximación del mapa de México en XAML para poder utilizarlo en nuestras aplicaciones Silverlight / WPF.  En este artículo veremos cómo crear un control de usuario reutilizable a partir de este XAML para poder usarlo en la plataforma Silverlight.

Para iniciar, es buena idea mostrar el mapa de XAML que usaremos.  El mapa de México en XAML lo pueden descargar del sitio de contenido de La Liga Silverlight.  Para mostrar el mapa estoy usando KaXaml, una excelente herramienta para edición de XAML alternativa a las ya conocidas herramientas como Visual Studio .NET 2008 o Expression Blend.

Muy bien, para iniciar debemos hacer notar los siguiente:

  • Cada estado de la república es un Path, el cual está envuelto en un contenedor <Canvas> con el nombre de cada estado en la propiedad x:Name, esto para poder tener control sobre cada uno de los estados (al darle click sobre cada uno de ellos o al mover el mouse encima de él). 32 estados = 32 Path = 32 Canvas.
  • El <Canvas> raíz de todo el mapa se llama MapaMexico.  Este <Canvas> es el contenedor de los 32 estados del país

Comenzando

Crearemos una aplicación de tipo Silverlight por medio de Visual Studio .NET 2008 y usando las plantillas.  A esta aplicación le llamaremos PortalMexico como a continuación se muestra en la ilustración:

Posteriormente seleccionamos la opción de crear una aplicación Web y cerramos la ventana de diálogo.  Una vez descargado el mapa de México en XAML, agregamos los dos archivos Mexico.xaml y Mexico.xaml.cs al proyecto de Silverlight.  Estos archivos son el diseño en XAML y el code-behind relacionado a ese XAML respectivamente.

El mapa de México en XAML ya incluye código preconstruído el cual colorea el estado de la república Mexicana que esté seleccionado a través del cursor del mouse.  Este código es bastante sencillo y se logra de la siguiente manera:

Vale la pena notar que el código itera sobre todos los estados (Canvas) que están en el Canvas raíz (MapaMexico) y por cada uno ejecuta el método RegisterEvents() que a continuación se muestra:

Como podrás notar, para los eventos MouseEnter (al entrar el cursor del mouse sobre el Canvas), MouseLeave (al salir el cursor del mouse del Canvas) y MouseLeftButtonUp (al hacer clic completo con el mouse sobre un estado (Canvas)) se asignan los manejadores de evento:

estado_MouseEnter

estado_MouseLeave

estado_MouseLeftButtonUp

…respectivamente.  Esto quiere decir que, estos métodos (denominados manejadores de eventos por tratarse de métodos que se ejecutan cuando se dispara un evento) se comparten para los 32 estados!  librándonos de escribir más código del necesario, el cual también pudo haber sido resuelto de la siguiente manera pero menos eficiente:

O peor aún:

Asimismo, cuando haces clic sobre un estado del mapa de México, te muestra el navegador un mensaje de alerta con el nombre del estado que has seleccionado.  De hecho lo que te muestra no es más que el nombre del Canvas que envuelve el Path que representa el estado, tal y como lo podemos apreciar en el siguiente fragmento de código tomado del code-behind del mapa:

Es notable la presencia de la clase HtmlPage de Silverlight, la cual encapsula toda la funcionalidad necesaria del HTML Bridge de Silverlight.  Esta característica permite manipular el DOM del navegador con .NET dentro del plugin de Silverlight!!!  Esta es uno de los componentes que en lo personal considero bastante potente en esta plataforma y motivo suficiente para incluir Silverlight en todos nuestros proyectos Web ya que si abrimos un poco nuestra imaginación podremos darnos cuenta que tal vez, y digo, tal vez… no volvamos a necesitar crear scripts de Javascript para nuestras aplicaciones Web.  Este tema merece artículos en específico que próximamente estarán publicados en este blog y en La Liga Silverlight.

Vale la pena probar el mapa de México en XAML tal cual se puede descargar de La Liga Silverlight, sin modificaciones para poder entender lo que hemos explicado hasta el momento.  Para que la aplicación PortalMexico inicie con Mexico.xaml en vez de con Page.xaml, simplemente modifica la siguiente línea en el archivo App.xaml.cs, el cual es el archivo de código global para toda nuestra aplicación Silverlight, y posteriormente ejecuta la aplicación presionando la tecla F5 o eligiendo la opción Start Debugging del menú Debug en Visual Studio .NET 2008 (por favor toma en cuenta el nombre de espacio Mexico que contiene la clase Mexico)

Muy bien, ya que explicamos la manera de cómo se están adjuntando los manejadores de eventos a los diferentes eventos para cada estado y qué sucede cuando un usuario hace clic en algún estado es momento de implementar nuestro control de usuario en la aplicación Silverlight:  Es hora de reutilizar Mexico.xaml en Page.xaml :)

C# a la alza, Basic a la baja

Según el índice TIOBE, este año cierra con una interesante estadística acerca de los lenguajes de programación más populares, en donde podemos ver repuntar a un C# al lugar número 6 a comparación del lugar 8 que tenía el año pasado, mientras que los lenguajes basados en Basic (no específicamente VB.NET, hay que aclarar…) van a la baja perdiendo dos posiciones y terminando en número 5 en este año que apenas termina.

El índice TIOBE muestra las estadísticas de popularidad de los lenguajes de programación, no precisamente cuál es mejor o peor.

Para ver la estadística completa lo pueden hacer aquí.

Qué les dice a ustedes esta estadística?

Saludos!

Guitar Hero World Tour v.s. Rock Band

Nuevo año, Nuevo vicio

A casi ya un año de haber estrenado el Rock Band pasó lo que tenía que suceder:  el pad azul de la batería partido a la mitad debido a la serie de golpazos a la Neil Peart, Matt Cameron o Lars Ulrich.  Y pues también pasó lo que tenía que suceder: reemplazar dicho control de batería por otro nuevo.  Para esto tenía varias opciones:

1.- Reparar el pad de la batería actual

2.- Comprar otra batería de Rock Band 1

3.- Comprar una batería de Rock Band 2

4.- Adquirir el Guitar Hero World Tour

La primer opción fue la más viable económicamente hablando no obstante las secuelas de buen uso no solo se ven reflejadas en el pad del color mencionado sino también en el pedal y en el plástico del pad amarillo.

La siguiente opción era la siguiente más viable económicamente hablando ya que hoy en día es fácil conseguir un control de batería del Rock Band 1 a unos 50USD; pero con esto de la crisis ya no era una opción tan atractiva ya que la batería sufre de diversos defectos de construcción y no está pensado para jugadores traumados intensos.

Ahora en el PDC 2008 tuve la oportunidad de probar la batería del Rock Band 2 y mi sorpresa fue más de decepción que de agrado:  tiene el mismo diseño con tan solo dos “mejoras”: los pads son de hule y el pedal tiene una placa de metal pero no deja de ser plasticosa y endeble.  Por si fuera poco aún no venden la batería por separado para Xbox 360 :(

Por todo lo anterior la opción tomada fue la no. 4, y este es el motivo principal de este post el cual va dirigido principalmente a todas aquellas personas que están en la disyuntiva hoy en día de “compro el Rock Band 2 o el Guitar Hero World Tour?”, “cuál de los dos es mejor?”, “son mejores los instrumentos del Rock Band o del GHWT?”, y un sinfín de preguntas.  Aquí van mis comentarios:

La Batería

  • La batería del Guitar Hero World Tour realmente sobrepasó mis expectativas ya que a primera vista se denota una construcción mucho más fuerte y de más resistencia que su contraparte del Rock Band 1 o 2.  Las patas y armadura de la batería es de metal lo cuál la hace más pesada y con esto el control se mantiene más fijo resultando en una experiencia de juego superior, además las patas tienen gomas antiderrapantes para que no se resbale tu control en pisos lisos.
  • Los 3 pads + los 2 platillos y el pedal ofrecen en conjunto una experiencia muchísimo más realística al estar tocando la batería ya que cada uno de esos componentes tiene su propia funcionalidad y sonido: los toms son toms siempre, el platillo amarillo es hi-hat siempre, etc. Esto difiere bastante a la batería del Rock Band 1 o 2 en donde el pad azul a veces es tom, a veces es platillo,etc.; lo mismo sucede con el pad verde.  Sin duda alguna la batería del GHWT es lo que debió ser la del RB desde un inicio. Felicidades Red Octane por tan fabuloso acierto.  El único contratiempo que le he encontrado es que si eres un asiduo jugador de Rock Band como yo entonces encontrarás que la distribución es un poco confusa al principio debido al platillo amarillo un poco elevado y la presencia del platillo naranja.  Es solo cuestión de acostumbrarse y al poco rato ya estarás tocando a más de 95% todas las canciones ;)
  • Los pads y platillos están recubiertos de hule macizo y la batería es realmente silenciosa.  No más vecinos simpáticos quejándose a tu puerta de tus fills metaleros en medio de una canción… no más.
  • La batería es wireless.  Pro: ya no tienes que andar cuidando a los malacopa de tus amigos de que no se tropiecen con el cable.  Contra:  Usa dos baterías AA lo cual seguramente drenará su carga en pocos días.  Te recomiendo que adquieras baterías recargables para que no sufra tu bolsillo.
  • La batería tiene entrada MIDI, lo cual significa que puedes conectar una batería electrónica con salida MIDI a este puerto y jugar con ella como si fuera el control.  Creo que esto sería la máxima expresión de experiencia en juegos de batería y la mejor manera de aprender a tocar tus canciones favoritas.
  • La batería es 100% compatible con el Rock Band… así que matas dos pájaros de un tiro ;)
  • Contras:
    • El pedal, ya que aunque se ve con una mejor construcción que el del Rock Band, aún sigue siendo de plástico y muy probablemente será el primer componente que se rompa a corto plazo.
    • Los platillos naranja y amarillo están muy cerca de los pads y llega a ser un poco incómodo su uso.

La Guitarra

  • Aunque no soy mucho de jugar ni como guitarra ni bajo, el control que trae el GHWT está excelentemente bien construido y es un poco más grande que el del GH3 o del RB.
  • La guitarra tiene una entrada RJ11… no tengo idea por qué si alguien sabe por favor ponga un comment :)

El Juego

  • Red Octane se sacó un 10 con el GHWT por el catálogo de canciones.  Es realmente SUPERIOR al del Rock Band 2:
      • Parabola, Schism y Vicarious de Tool !!! Esto es simplemente la razón suficiente para comprar el juego :D
    • Beat it de Michael Jackson…. auuuu!  Hasta el vocalista de la banda hace el Moonwalk
    • Love me two times de The Doors
    • Band on the run de McCartney y sus Wings
    • Escuela de Calor de Radio Futura ! (arriba los 80’s :) )
    • Hotel California de The Eagles
    • Un largo etcétera…
  • Puedes hacer fills en muchas partes de las canciones
  • Apariciones de diversas personalidades rockeras entre ellas Mr. Billy Corgan, Ted Nugent, etc.
  • Puedes personalizar mucho más a tus personajes (rostro, edad, actitud al iniciar, actitud al ganar y perder, etc.etc.etc)

Resumen

Si es tu primer juego musical no lo dudes y adquiere mejor GHWT y compra el DVD del Rock Band 2 por separado ya que el catálogo de canciones de Rock Band es mucho más amplio y cada semana se actualiza con nuevas adiciones:  GHWT no le llega a los talones a Rock Band en ese sentido, pero los instrumentos del GHWT son superiores a los de Rock Band.

Finalmente, toma en cuenta que muchas baterías de GHWT para Xbox 360 están descalibradas de fábrica, esto es, que su sensibilidad está muy baja y tienes que literalmente azotar los platillos (principalmente el naranja) para que registre el golpe.  Exige en la tienda donde lo compres o en la carta a Santaclós que te la calibren (se hace por medio de un cable MIDI-USB y un software que Activision liberó hace poco).  Ojo: es solo para Windows y el cable lo da Activision de manera gratuita pero desgraciadamente aún no hay soporte para México y/o Latinoamérica :@

Keep on rockin’ in the free world.

Salu2!

Transacciones en Workflow Foundation

Transacciones en Workflow Foundation

Muy frecuentemente en nuestras aplicaciones necesitamos incorporar algún tipo de mecanismo que nos asegure que los datos que estemos usando hayan sido grabados de manera correcta y consistente. Bienvenidos a las Transacciones, las cuáles -en el contexto de WF- las podemos utilizar como medio para asegurarnos que efectivamente la información haya sido actualizada tal y como lo esperamos y en todo caso de alguna falla la información no quede incompleta o inconsistente.

Pero ¿qué es una Transacción?

Una transacción la podemos definir como una unidad de trabajo en donde se ejecutan exitosamente todas las tareas que se incluyen en la transacción, o no se ejecuta ninguna.

En WF podemos incorporar en nuestros flujos de trabajo dos tipos de transacciones: Transacciones de tipo 2PC (Two Phase Commit) y Transacciones Compensables. En este capítulo explicaremos y mostraremos el uso de cada una de ellas para nuestras aplicaciones.

Transacciones Two Pase Commit

Este tipo de transacción es aquella que está coordinada a través de un administrador el cual su objetivo es determinar si las acciones y datos relacionados con la transacción se deben aplicar en un momento específico. Ese momento lo determina el administrador tomando en cuenta si todos los recursos relacionados en la transacción “votan” para que la transacción continúe o se deshaga en su totalidad.

Las transacciones de esta categoría deben tener las propiedades ACID, las cuales son por sus siglas en inglés: Atomicity, Consistency, Isolation y Durability.

La prueba del “Ácido” para las transacciones

Como describimos en el párrafo anterior, las transacciones de tipo Two Phase Commit deben tener ciertas propiedades para que su comportamiento sea el esperado y funcionen correctamente. Estas propiedades las explicaremos a continuación:

Atomicidad (Atomicity). Esta propiedad indica que todas las operaciones relacionadas con la transacción se han ejecutado en su totalidad o no se han ejecutado, es decir, esta es la propiedad que nos asegura que un proceso de actualización de datos no puede quedar a medias provocando que nuestros datos queden en un estado incorrecto. Un ejemplo en donde podemos apreciar esta propiedad es cuando realizamos un retiro de dinero en un cajero automático: solicitamos cierta cantidad y esa cantidad nos es dada en efectivo. Ahora bien, imaginemos el caso en el que la transacción no fuera atómica y que ocurriese alguna falla en la transacción, digamos que el cajero automático no tenga dinero suficiente para nuestro retiro. Terminaríamos con un saldo menor e incorrecto en nuestra cuenta de ahorros pero con nada de dinero en efectivo en las manos. O tal vez el pago de un servicio en línea por medio de una tarjeta de crédito. En fin, ejemplos podríamos decir muchos. Gracias a la propiedad de atomicidad en las transacciones nos aseguramos que en algún caso de error en los ejemplos anteriores los datos relacionados no se vean afectados.

La Atomicidad nos asegura que todas las operaciones en una transacción se realizan todas o no se realiza ninguna.

Consistencia (Consistency). Esta propiedad indica que los datos envueltos en la transacción se deben mantener consistentes. Si tomamos como ejemplo una base de datos relacional esto indica que la transacción no debe romper ninguna restricción que haya sido declarada. Tal es el caso de una transacción que requiere insertar un registro en dos tablas con una relación padre-hijo por ejemplo las tablas Cliente y Factura. Si la transacción inserta exitosamente un registro en la tabla Factura pero falla al insertar el registro correspondiente en la tabla Cliente, la integridad de la base de datos se vería afectada y la transacción –gracias a la propiedad de Consistencia- es echada para atrás.

La Consistencia nos asegura que la integridad de los datos se mantendrá una vez realizada la transacción y que no se romperá ninguna restricción.

Aislamiento (Isolation). Esta propiedad nos permite que las operaciones en una transacción no afecten a otras. Existen diferentes tipos de nivel de aislamiento para las transacciones que podemos utilizar según el contexto y las necesidades propias de la aplicación y/o flujo de trabajo que estemos desarrollando.

La propiedad de Aislamiento nos asegura que las operaciones de una transacción no pueden afectar a otras.

Durabilidad (Durability). Esta propiedad nos asegura que una vez realizada la transacción los datos modificados o agregados quedarán guardados de una manera no-volátil y estarán disponibles aún si ocurriese una falla en el sistema. Esto es cierto aún si la falla ocurriera 1 milisegundo después de haber sido realizada la transacción.

La Durabilidad nos asegura que una vez realizada la transacción los datos quedarán guardados aunque falle el sistema.

Ejemplo

Veamos ahora cómo implementar transacciones de tipo Two Phase Commit en nuestros flujos de trabajo utilizando Workflow Foundation. Cabe mencionar que el siguiente ejemplo supone la existencia de la base de datos Northwind implementada en SQL Server Express de manera local y supone también que se ha configurado el servicio SqlWorkflowPersistenceService usando una base de datos también local llamada WorkflowStore usando los scripts que se incluyen con el .NET Framework 3.0 presentes en [Carpeta de Windows]\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN. Para mayor información acerca de SqlWorkflowPersistenceService consulta el capítulo “Persistencia” en esta obra.

Con Visual Studio .NET abierto, hagamos un nuevo proyecto de tipo Sequential Workflow Console Application. Con el diseñador de WF en la pantalla arrastremos y coloquemos una actividad de tipo TransactionScope tal y como lo muestra la siguiente figura:

La actividad TransactionScope es una actividad compuesta, es decir, que puede contener una o más actividades dentro de ella. Todas las actividades que definamos dentro de la actividad TransactionScope participarán en la misma transacción. Una de las propiedades más importantes de esta actividad es TransactionOptions.IsolationLevel la cual indica el nivel de aislamiento que esta transacción tendrá al ejecutar todas sus operaciones siendo su valor predeterminado Serializable (el nivel de aislamiento más restrictivo). A continuación en la tabla 1 se enlistan los diferentes niveles de aislamiento disponibles:

Nombre

Descripción

Serializable

Los datos no aplicados pueden ser leídos pero no modificados, y no se pueden insertar datos durante la transacción

RepeatableRead

Los datos no aplicados pueden ser leídos pero no modificados. Se pueden insertar datos durante la transacción

ReadCommitted

Los datos no aplicados no pueden ser leídos durante la transacción pero sí pueden ser modificados

ReadUncommitted

Los datos no aplicados pueden ser leídos y modificados

Snapshot

Los datos no aplicados pueden ser leídos. Antes de modificar los datos verifica si otra transacción ha modificado los datos después de que se leyeron los datos, si es así arroja una excepción

Chaos

Los cambios pendientes de transacciones que tengan un nivel de aislamiento superior no pueden ser reemplazados

Unspecified

Otro. Sin embargo este nivel no puede ser asignado de manera manual

Tabla 1. Niveles de aislamiento para las transacciones

No podemos colocar una actividad TransactionScope dentro de otra

Para continuar con el ejemplo usaremos una actividad de tipo Code y la colocaremos dentro de la actividad transactionScopeActivity1. Es en esta actividad en donde declararemos el código que deseamos que participe en la transacción así que asignemos un método llamado “Transaccion” en la propiedad ExecuteCode de la actividad codeActivity1. En este método definamos el siguiente código:

Asimismo, en nuestra clase del flujo de trabajo definamos una propiedad pública de tipo int llamada RegionID. Esta propiedad nos servirá como mecanismo para enviar parámetros a nuestro flujo de trabajo específicamente al comando de SQL que vamos a ejecutar.

Ya que vamos a demostrar el poder y comportamiento de las transacciones es buena idea agregar un Fault Handler a nuestro flujo de trabajo para que capture cualquier tipo de excepción, es por eso que vamos a usar la clase System.Exception. En el fault handler agregaremos una actividad de tipo Code la cual ejecutará el método ErrorHandler para mostrar un mensaje amigable al usuario. La siguiente figura muestra el diseñador de Workflow Foundation en la vista de Fault Handlers.

El código del método ErrorHandler será el siguiente:

Una vez hecho lo anterior, asignemos un método manejador para el evento Completed de nuestro flujo de trabajo. Esto lo podemos lograr haciendo clic en el botón de eventos en la ventana de propiedades del flujo de trabajo tal y como lo muestra la siguiente figura:

El nombre del método será WorkflowCompleto y tendrá el siguiente código:

Por último debemos modificar el código que inicia la instancia del flujo de trabajo en la aplicación de consola. Para esto modifiquemos el código incluido en Program.cs para que tenga el siguiente código antes de invocar instance.Start().

Muy bien! Hemos preparado nuestro flujo de trabajo para que agregue una nueva región a la table Region de la base de datos Northwind dentro de una transacción. Probemos nuestro proyecto ejecutándolo con Ctrl + F5 y pasemos la región número 5 como parámetro. En este caso la operación de inserción es exitosa y nuestro flujo de trabajo nos despliega el siguiente mensaje en la consola:

Finalmente debemos comentar que en caso de alguna falla la actividad TransactionScope se encargará de echar para atrás todos los cambios dejando los datos en un estado consistente.

Transacciones Compensables

Este tipo de transacciones nos permiten definir una serie de operaciones a ejecutar cuando la ejecución de la transacción falla, es decir, la compensan. A diferencia de las transacciones de tipo Two Phase Commit en donde las operaciones se ejecutan o no se ejecutan, en una transacción compensable las operaciones sí son ejecutadas y en todo caso de una falla esas operaciones no son echadas para atrás sino que se ejecutan algunas otras acciones que complementan o “compensan” esa falla. Para dar un ejemplo de esto podemos mencionar el caso cuando pagamos un excedente de algún servicio, en donde la operación compensatoria es emitir una nota de crédito o cupón para hacer uso de ese beneficio posteriormente. Cabe mencionar que este tipo de transacciones son útiles cuando ya no podemos echar para atrás los cambios producidos por la misma transacción o por otra.

Ejemplo

Para demostrar este tipo de transacciones retomemos el proyecto de ejemplo anterior, sin embargo en vez de usar una actividad de tipo TransactionScope utilizaremos la actividad CompensatableTransactionScope la cual nos permite definir una serie de actividades a ejecutar como parte de esa transacción tal y como ocurre con su contraparte explicada en la sección anterior.

Asimismo, para esta demostración provocaremos un error a propósito después de ejecutar la transacción que da de alta regiones en la base de datos Northwind. La actividad que arrojaremos será de tipo System.Exception. La siguiente figura muestra el diseñador de Workflow Foundation con los cambios necesarios:

Debemos notar que el tipo de transacción que ejecuta la actividad codeActivity1 ahora es de tipo CompensateTransactionScope y que agregamos una actividad de tipo Throw después de la transacción para provocar el error mencionado.

Para indicar la serie de actividades compensatorias a ejecutar debemos definirlas en la vista de la actividad compensationHandlerActivity1. Esto lo podemos lograr haciendo clic la opción apropiada del menú desplegable de la transacción compensatableTransactionScopeActivity1 tal y como lo muestra la siguiente figura:

En la actividad compensationHandlerActivity1 añadiremos una actividad de tipo Code. Esta actividad nos servirá para ejemplificar la compensación de una transacción cuando esta falla. A esta actividad le relacionaremos el método Compensa y en este método solamente agregaremos el siguiente sencillo código:

Finalmente, en la vista de Fault Handlers agregaremos una actividad de tipo Compensate, la cual indica por medio de su propiedad TargetActivityName la actividad que se quiere compensar, en nuestro caso será la actividad compensatableTransactionScopeActivity1. Esta actividad nos servirá para indicar de manera manual que queremos realizar la compensación correspondiente. La figura 7 muestra el diseñador de Workflow Foundation con la vista de Fault Handlers:

Resumen

En este capítulo vimos los dos tipos de transacciones que podemos incorporar en nuestros flujos de trabajo. Asimismo dimos ejemplos y escenarios en donde pueden ser implementados y la manera sencilla y amigable que disponemos en Workflow Foundation para hacer uso de ellos.

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

FIL.2008 = new FIL.2008();

Los ojos de toda América Latina están puestos en la emblemática ciudad de Guadalajara, Jalisco, México debido a la más reciente edición de la Feria Internacional del Libro que en esta ciudad se lleva a cabo desde hace más de un par de décadas.  En especial esta edición me parece de lo más interesante -y obligada para todas aquellas personas que gustamos de la letra-, ya que el país invitado en esta ocasión es Italia; país de grandes iconos de literatura moderna y clásica, país del buen comer y por qué no, del buen beber.

Sin embargo, no solamente se engalana por la presencia del mediterráneo país sino también por una serie de eventos y presentaciones efectuadas por grandes luminarias nacionales y extranjeras en el plano literario.  Por ejemplo, tendremos el estreno mundial de la últimamente multi-mencionada obra operística “Santa Anna” de Carlos Fuentes, gran escritor mexicano nacido -por accidente- en Panamá, acerca de los últimos años de vida de este personaje ligado íntimamente a la historia de nuestra nación.  También tendremos diversos estrenos en papel y tinta como por ejemplo la más reciente obra del maestro Monsiváis, el nuevo libro de Martha Chapa -ipso facto antojable al simple oído- acerca de los Tacos de México (de dónde más caray…), diferentes lecturas públicas de poesía llevadas a cabo por personas como José Emilio Pacheco, entre otros momentos invaluables.

Un plato fuerte de esta edición será el encuentro de magníficos moneros como Sergio Aragonés, Rius y Trino (no me lo puedo perder :) ), y claro está, la estupenda oportunidad de adquirir algunos buenos ejemplares para las bibliotecas personales a excelentes precios (espero).  Toda la semana que sigue, a partir del día de mañana podremos disfrutar de este espléndido evento.  Si estás en la ciudad, o vienes durante la siguiente semana por negocios / placer: aprovecha.

Más que nunca me da mucha alegría vivir en esta ciudad, que, como en pocas, se pueden disfrutar eventos de este calibre cultural de gran importancia internacional.

Quien tenga oídos para oír, que oiga.

Saludos!

Reunión de la Comunidad Guadalajara .NET en el ITESO y premier de La Liga Silverlight

 

El próximo día 4 de diciembre, de 3:00pm a 6:00pm tendremos una reunión en el ITESO por parte de la Comunidad Guadalajara .NET, en donde –como siempre- platicaremos diversos temas de suma importancia del mundo de la plataforma Microsoft.

Por mi parte estaré platicando acerca de Silverlight!… Así que para todos aquellos que estén interesados en asistir revisen la página de la comunidad en donde publicaremos más información al respecto y la agenda final en los próximos días.

Asimismo, dentro de la misma reunión tendremos la premier de La Liga Silverlight:  La primer comunidad MSDN de habla hispana acerca de Silverlight.  Si quieres conocer de qué se trata y/o cuál es el objetivo de este gremio !no faltes!, habrá una sesión de preguntas y respuestas y algunos regalillos sorpresas.  Ojo: no es una reunión de La Liga Silverlight, esa la tendremos próximamente! ;)

Así que no hay pretextos!  Nos vemos en el ITESO !!!

De traumas, estrés y otras incomodidades

No hay nada que me estrese más que mudarme, sin embargo, lo he hecho muchas veces.  No sé si sea el duendecillo de la costumbre a algún lugar, o el tener que bucear entre escombros de bobadas y recuerdos inútiles lo que me pone los nervios de punta.

No obstante, es y será siempre un buen momento para inventariar y re-considerar nuestros tesoros personales.  Yo por mi parte me considero un melómano-bibliófilo-cinéfilo, y por lo tanto –analizando bien este asunto- lo que más me incomoda y preocupa por encima de muchas otras cosas es que mis discos, libros y películas no les afecte el cambio de domicilio.  Creo que simplemente por estar guardando los cd’s en una caja atascada ya rompí como 5 cajas :(

También una de las cosas que es digna de mis más terribles fiacas es el re-acomodo de tooooodo y peor si no tendrás el lugar adecuado o de buen tamaño como lo tenías antes.

Y qué me dicen de los nuevos vecinos?  Si de por sí es complicada la convivencia con personas cercanas y queridas, aún más lo es el tratar con criaturas totalmente extrañas y ajenas.  Claro está, siempre existirá desde la típica señora con perfil de detective hasta las familias que viven en comuna dentro de la misma casa.

En fin, siempre son buenos los cambios.  Siempre es bueno sacudirse la mala energía que nos ahoga y detiene, ya que esto siempre nos llevará a nuevos buenos caminos.

Sino, a ver.. Cómo termina The Godfather Parte 1??? Claro! Con una mudanza.  La mudanza representa en la película el fin de una etapa en la vida de la familia Corleone para comenzar otra con nuevos bríos y oportunidades, sino, no hubiera hecho toda la fortuna e imperio Michael Corleone… o sí???  Por qué estoy escribiendo esto?

No lo sé.  Pero lo que sí sé es que todo cambio es bueno,… aunque el cambio de domicilio sea a solo 10 minutos :P ….  La mala vibra se queda y nosotros nos vamos.  Ah! y también se mudan conmigo “Family Guy meets the masked Chamulas”.

Salu2!

Nuevo dashboard de Xbox 360

Si tienes Xbox 360 y Xbox Live seguramente ya descargaste el nuevo dashboard de la consola, o como Microsoft lo promociona: “La experiencia Xbox 360”.

En lo personal me gustó muchísimo más que el dashboard tan horrendo poco amigable que teníamos antes, ah! y qué tal el cinemático de inicio??? WOW… un aplauso Microsoft!

<Pero>Ok, los Avatars a simple vista son una copia flagrante de los Mii’s de la consola Wii de Nintendo.  <Ok>Sin embargo hay diversas personalizaciones que puedes hacer como cambiarles sus ropitas y otras monadas</Ok></Pero>

En fin, en general una gran mejora al querido Xbox que sin lugar a dudas les quedó espectacular.

Por cierto, alguien ya jugó Rock Band 2 con la batería del Guitar Hero World Tour???  Alguien tiene algo bueno o malo qué decir al respecto?

Salu2!