2.12.2012

¿Qué es un micro ORM?

Muchos de nosotros hemos utilizado herramientas para mapear del mundo relacional al mundo orientado a objetos tales como el Entity Framework y NHibernate. Sin duda el uso de estas herramientas esta motivado por la facilidad que se logra para trabajar con el acceso a datos. Sin embargo, a muchos de nosotros siempre nos queda una espinita acerca del uso de estas herramientas ya que a ratos quedan sensaciones un poco diferentes respecto a la eficiencia de las mismas. En mi caso personal, hasta antes del modelo Code First del Entity Framework no estaba del todo convencido de utilizar este ORM –> aunque Microsoft le quiera llamar de otra forma –> en un proyecto enterprise, ya que considero que los POCOS son parte fundamental en cualquier arquitectura que vayamos a utilizar por su eficiencia y porque podemos utilizarlos como “transportador” de objetos neutral, ya que al final estos objetos se serializan en tipos SOAP estándar que nos van a permitir que sean consumidos de forma simple desde otras tecnologías tales como Java y PHP –> claro, siempre y cuando usemos tipos estándar.

Definición

Sin embargo, desde hace un tiempo atrás me di a la tarea de buscar algo intermedio, que me permitiera tener algunas de las abstracciones de lo ORM, pero que no me castigara en desempeño y me encontré el término Micro ORM. Un micro ORM es por lo general una librería pequeña que abstrae la funcionalidad principal de ADO.NET a través de un uso extensivo de los tipos dinámicos. Esto permite tener la misma funcionalidad que con ADO.NET tradicional, pero con mucho menos código; todo esto sin perder desempeño.

Ejemplo

Para ilustrar el concepto vamos a crear un ejemplo sencillo en el cual vamos a agregar, buscar y eliminar un registro desde una tabla en una base de datos SQL Server, este ejemplo lo vamos a desarrollar con Dapper.NET. La tabla que vamos a utilizar es la siguiente:

image

Como comenté anteriormente, los Micro ORM basan su funcionalidad en los POCOS, por lo tanto vamos a crear una librería que será nuestra capa de entidades –> siempre importante separar el estado del comportamiento. EL POCO para la tabla empresa es el siguiente:

image

Ahora procedemos con la capa de acceso a datos. En esta capa vamos a crear métodos estáticos para Agregar, Obtener y Eliminar empresas. Recuerden que en esta capa utilizamos métodos estáticos porque no existe razón alguna para mantener estado en estas invocaciones. Nótese que la hilera de conexión está en el archivo, algo que no es una recomendación pero un “abuso” propio para poder desarrollar el ejemplo de una manera más sencilla.

image

En el código anterior se puede ver que para hacer un select sobre una tabla utilizamos el método de extensión genérico Query, el cual recibe un arreglo de parámetros –> aunque esta sobre cargado para recibir más parámetros tales como transacciones –> y retorna un conjunto de datos tipificado en base al tipo enviado por parámetro en el método query –> en el generic.

image

Igualmente para ejecutar sentencias SQL que no retornan conjuntos de datos pero que llevan a cabo acciones sobre las tablas como el eliminar o el agregar vamos a utilizar el método Execute. Este método al igual que el Query, es un método de extensión que para este ejemplo, recibe una colección de parámetros los cuales por orden son asignados a los parametros definidos con @ dentro de la sentencia SQL; por ejemplo @Nombre –> Nombre = pEmpresa.Nombre.

image

Ahora procedemos a crear una capa de negocios que simplemente tiene las llamadas respectivas a la capa de acceso a datos.

image

Si queremos exponer estos métodos de lógica de negocio, vamos a tener que marcar como serializables los campos del POCO y el POCO utilizando el serializador de WCF.

image

Luego procedemos a crear el servicio. El primer paso es crear una librería WCF y definir el contrato del servicios

image

Después procedemos a implementar el contrato del servicio

image

Si queremos consumir el servicio desde cualquier interface, simplemente agregamos la referencia al servicio recién creado y a través del proxy se generarán los tipos necesarios para ejecutar nuestra aplicación.

Etiquetas de Technorati: ,,,

2.04.2012

La importancia de las pruebas unitarias –> Unit Tests

Los desarrolladores de software hablamos constantemente de como desarrollar software, como crear una arquitectura nueva para nuestra aplicación, que tipo de tecnología utilizaremos en el “front end”, el tipo de la base de datos a utilizar, etc. Sin embargo, es muy extraño encontrarse un desarrollador de software y más extraño aún encontrarse un arquitecto de software hablando de las pruebas que se le van a aplicar al software. En general probar software es un tema que siempre se ha dejado para el final en donde por falta de tiempo termina siendo una tarea hecha a la carrera y sin mucho empeño. Además, los desarrolladores tienden a pensar que esa tarea es de otros compañeros los cuales en el mejor de los casos son los “testers” y en el peor de los casos son los clientes del sistema.

Sin embargo, desde el punto de vista de la arquitectura de software, garantizar el funcionamiento correcto tanto desde el punto de vista estructural como funcional es una tarea tan importante como diseñar el software. Las pruebas funcionales están relacionadas con que el software desarrollado haga las cosas como el usuario espera y las pruebas estructurales son los unit test o pruebas unitarias. Las pruebas funcionales por lo general las llevan a cabo “testers” o usuarios finales que prueban y garantizan el buen funcionamiento del software. Por otro lado, las pruebas estructurales o pruebas unitarias buscan garantizar que el sistema no se quiebra cuando recibe cambios o nuevas características; estas pruebas la realizan los desarrolladores de software.

Los desarrolladores y las pruebas unitarias

Aunque para nosotros los desarrolladores las dos formas de hacer pruebas deberían ser igual de importantes, debemos estar más involucrados en las pruebas unitarias ya que es algo que debemos de programar nosotros mismos. Estas pruebas nos van a permitir validar aspectos tales como:

  • Si hago un cambio en el módulo A no voy a quebrar algo en el módulo B –> esto se da porque las pruebas unitarias se ejecutan cada vez que voy a subir el código como listo a mi repositorio de código, y si mi cambio en A va a quebrar B, las pruebas unitarias de B no serían exitosas.
  • Cuando trabajo en equipo evita que yo modifique con un error un código que ya esta probado y funcionando, ya que para que yo pueda subir el código al repositorio compartido tengo que ejecutar todas las pruebas unitarias –> tanto las mías como las de mis compañeros –> y si alguna falla no debo subir el código.
  • Las pruebas unitarias me permiten hace refactorización del código para permitir que mi código pueda ser más legible y más reutilizable, ya que cuando se desarrollan se observan oportunidades de mejora que no se distinguen cuando estamos desarrollando –> por ejemplo el uso amplio del polimorfismo.

Al hablar de pruebas unitarias e involucrar a los desarrolladores en este tema, surgen muchos mitos y resistencia de parte de estos últimos ya que por lo general a el desarrollador no le gusta probar. Los mitos más comunes son:

  • Las pruebas no las hago yo, le tocan al tester: FALSO. Desde todo punto de vista esta afirmación no tiene sentido ya que nadie más que le propio desarrollador conoce la estructura de su programa y nadie más que el sabe que se debe de probar para mantener al sistema estable y sin caídas inesperadas. Es tan importante que el desarrollador haga sus pruebas ya que con esto eliminamos en un porcentaje muy alto – depende del porcentaje de cobertura – la posibilidad de que nuestro sistema tenga caídas inesperadas no controladas. Además el construir estas pruebas le permite al desarrollador encontrar vacíos de diseño y oportunidades de mejora utilizando el refactoring –> algo de lo que hablaremos en otro post.
  • Si tengo que programar los unit test necesito más tiempo de desarrollo: FALSO. Esta más que demostrado que cuando uno utiliza pruebas unitarias reduce el tiempo de desarrollo de los proyectos, esto por cuanto se disminuye la mayoría del re trabajo en los proyectos de desarrollo. Por lo general el re trabajo es algo que no se toma en cuenta a la hora de hacer los planes de proyecto y al final es el rubro que se termina comiendo el cronograma y el presupuesto.
  • Los unit test son difíciles de programar y llevan mucho código: FALSO. Al contrario, las pruebas unitarias para que estén bien hechas deben de ser sencillas, rápidas, y fáciles de programar. De acuerdo a Roy Osherove en su libro “El arte de las pruebas unitarias” –> muy muy recomendado –> una prueba unitaria debe de ser escrita de forma tal que en 10 minutos tengamos algo para probar; y es totalmente cierto, en muy raras ocasiones toma más de 10 minutos el pensar y programar una prueba unitaria –> aunque al principio cuando se está aprendiendo puede que tome más.

En próximos post voy a enfocarme en cómo trabajar con pruebas unitarias en .NET y en Visual Studio.

Etiquetas de Technorati:

1.22.2012

WCF: ¿Qué es el metadata exchange - MEX?

Para los que trabajamos a diario con WCF este tema nos puede parecer simple y sencillo de comprender; sin embargo, en ocasiones me encuentro con desarrolladores que pese a que utilizan WCF muy seguido no saben el porque de este endpoint en el archivo de configuración. En este post vamos a aclarar el término y su importancia.

¿Qué es el metadata exchange - MEX?

El endopoint MEX es la manera en que se publica el metadata del servicio. ¿ Y que es este metadata? El metadata del servicio es la información que consumen los clientes para crear el proxy del servicio y así poder llamar el servicio. En otras palabras, cuando accedemos un servicio desde un cliente lo hacemos a través de un proxy – una clase – que se genera a partir del metadata del servicio – más acerca del proxy en el próximo post.

image

¿Es el MEX lo mismo que el WSDL?

Ahora, si hemos usado servicios web desde antes de que WCF entrara a escena nos va a surgir la pregunta ¿Es el MEX lo mismo que el WSDL del servicio? La respuesta es si y no. En realidad el WSDL y el MEX cumplen la misma función pero el MEX es la nueva versión de lo que antes era el WSDL – más al respecto en este link. En otras palabras, el MEX endpoint no es algo definido por Microsoft, si no más bien un estándar establecido por la W3C para exponer la metadata del servicio. El “no”, esta relacionado con el hecho de que aunque los dos hacen lo mismo lo hacen de diferente forma; siendo la principal diferencia el hecho de que el metadata expuesto a través del MEX se obtiene en menos viajes al servidor que si se hace utilizando el WSDL – en realidad para el MEX solo se requiere un viaje en cambio para el WSDL requiere de varios request para obtener todas las partes de la descripción del mensaje. Además el metadata con el MEX se puede exponer a través de más protocolos que el WSDL el cual solo soportaba HTTP(S).

¿Cuáles tipos de MEX tengo disponibles en WCF?

Existen muchos tipos de MEX en WCF, entre los que podemos mencionar MexHttpBinding, MexHttpsBinding, MexTcpbinding. Como podemos ver, la variación que existe esta relacionada a través del protocolo sobre el cual queremos exponer la metadata del servicio.

Etiquetas de Technorati: ,

1.03.2012

Windows AppFabric p2–> Configurando los servicios de WCF y WF

En el post anterior conversamos acerca de la instalación del Windows AppFabric en Windows 7. En este post vamos a configurar el AppFabric para que estén disponibles las funcionalidades de seguimiento, persistencia y caché distribuido.

Configurar el AppFabric

Para configurar el AppFabric tenemos que buscar la aplicación que nos permite llevar a cabo esta tarea, la cual se puede encontrar en el folder del Windows Server AppFabric en el menú de programas.

image

Cuando se ejecuta esta aplicación aparece el wizard para iniciar la configuración del Windows AppFabric.

image

El primer paso es configurar el monitoreo de los servicios y los workflows y luego establecer la configuración de la persistencia. Primero procedemos a configurar el monitoreo de los servicios y lo hacemos seleccionando la opción establecer la configuración de seguimiento o en inglés “Set monitoring configuration”. Luego seleccionamos el proveedor que vamos a utilizar para guardar la información de configuración – SQL Server en este caso - y luego seleccionamos Configurar.

image

En la pantalla de configuración para el seguimiento procedemos a seleccionar las opciones “registrar almacén de seguimiento en web.config” e “inicializar almacén de seguimiento”. En ambos casos estamos diciéndole al wizard que registre o cree la base de datos en SQLExpress y que ponga la configuración en el archivo config raíz para que todos los servicios puedan verla. Además vamos a crear la información para la cadena de conexión y le vamos a indicar como queremos que se llame la base de datos de seguimiento para que el wizard la construya si no existe. Por último, podemos verificamos los usuarios a los que les quedamos dar los permisos de administradores, lectores de la información generada y los editores de esta información.

image

Una vez finalizado le damos aceptar y se procederá con el procedimiento de configuración. Cuando la etapa esté lista nos aparece el siguiente mensaje:

image

En la pantalla inicial del wizard podemos ver que la configuración de este componente esta correcta. Ahora procedemos con la configuración de la persistencia de los workflows la cual es muy similar a la del seguimiento; aquí seleccionamos el proveedor de persistencia que queremos usar – sql server en este caso – y seleccionamos configurar.

image

Al igual que en el caso anterior procedemos a seleccionar las opciones marcadas en la siguiente pantalla para crear la configuración del servicio, la base de datos y el string de conexión general para las aplicaciones.

image

El resultado de la operación se verá a través del mensaje lanzado desde el wizard.

image

El siguiente ítem a configurar es el manejo del caché distribuido. Este es muy importante si las aplicaciones van a estar en un clúster y queremos crear un caché que nos permita reutilizar toda la información que deseamos tener de forma mucho más rápida que ir al repositorio. En este caso seleccionamos el proveedor de XML, ya que el proveedor de SQL Server solo funciona en una máquina que pertenezca a un dominio. También debemos seleccionar el tamaño del clúster con el que vamos a utilizar el caché. Luego de esto seleccionamos la opción configurar en el proveedor de configuración del caché.

image

Es importante indicar que el UNC del archivo XML debe de ser un directorio compartido. Ahora seleccionamos siguiente y nos aparece la opción de configurar el caché. Este paso lo dejamos así ya que es una característica que no vamos a utilizar inicialmente con el AppFabric.

image

La última pantalla nos permite iniciar el IIS para verificar que las opciones del IIS están configuradas y funcionando.

image

Ya en el IIS podemos verificar que tenemos las opciones de persistencia y seguimiento como válidas y disponibles.

image

Etiquetas de Technorati:

12.31.2011

Windows AppFabric p1–> Instalándolo en Windows 7

He decidido iniciar con una serie de post acerca del Windows AppFabric para crear arquitecturas distribuidas basadas en un servidor de aplicaciones en tecnologías Microsoft. Este es el primer post de la serie y para empezar he decidido utilizar Windows 7 como sistema operativo base.

Instalar el AppFabric en Windows 7

Ya que muchos utilizamos Windows 7 como sistema operativo de trabajo, o incluso existen empresas donde utilizan un pequeño servidor interno para instalar sus aplicaciones con Windows 7 Enterprise o Profesional decidí escribir este post que aunque parece repetido no lo es, ya que el anterior era acerca de instalar el AppFabric en Windows server 2008 R2 – algo mucho más complicado.

El instalador del AppFabric

Aunque podemos descargar e instalar el AppFabric para windows 7 desde el “Web Platform Installer”, yo prefiero descargarlo directamente desde el sitio de Microsoft y ejecutarlo desde mi máquina.

Como podemos ver en el sitio web de Microsoft dependiendo del sistema operativo que tengamos  debemos descargar el ejecutable establecido. En mi caso, estoy utilizando Windows 7 en 64 bits.

image

En la página de descargas procedemos con el archivo señalado en la imagen anterior.

image

Seguidamente procedemos a ejecutar el instalador y luego de la pantalla de bienvenida veremos la siguiente pantalla donde se nos pregunta que componentes deseamos instalar. En mi caso instalaré todos los componentes – por supuesto habrán más post respecto a la función de cada uno de estos componentes.

image

Luego se hará la comprobación de requisitos del sistema, como pueden ver en la siguiente imagen me falta un requisito para poder instalar el AppFabric.

image

Como ven, me falta el administrador remoto para IIS, el cual se puede descargar desde el web platform installer o desde el sitio www.iis.net. Cuando lo instalamos nos aparece el wizard de instalación.

image

Luego de finalizar esta instalación procedemos a darle “actualizar” a wizard del appFabric y ya podemos ver que ya no tenemos advertencias a la hora de continuar con la instalación.

image

Con eso procedemos a la instalación del AppFabric.

image

Una vez finalizada la instalación vamos a ver la pantalla de instalación completa y además una recomendación para instalar las últimas actualizaciones de Windows.

image

En el próximo post vamos a configurar el AppFabric para poder hacer tracking y persistencia de nuestros servicios y workflows.

Etiquetas de Technorati:

12.17.2011

Error TF237162: There is insufficient system memory on the Team Foundation Server SQL Server to run this query

 

El Problema

Trabajando con TFS en un máquina virtual de pruebas, me encontré este error cuando quise generar un Team project en VS 2010 para tener mis proyectos en una colección específica. Sin embargo se me presentaba el error TFS237162 y no me permitía crear los proyectos. Considerando que cuando instalo SQL Server yo le asigno el mínimo de memoria posible me di cuenta que el error podría andar por ahí.

Solución:

Para solucionar el problema solamente tuve que ir a incrementar la memoria máxima del servidor SQL Server que se usa como capa física de datos – La tenía en 64MB y la subí a 128 MB.

image

Luego de esto reinicié el servicio de SQL Server Express en la consola de servicios – accesible desde Windows + R  en services.msc

image

y los proyectos TFS ya pudieron ser creados de manera correcta.

image

Etiquetas de Technorati:

12.11.2011

Error 503 Accediendo TFS

Realizando una instalación básica de TFS 2010 en Windows 7, me encontré con el error 503 "Servicio no disponible” cuando quise acceder al sitio del Team Foundation. Investigando un poco me di cuenta que hay 3 posibilidades principales para que este error este sucediendo cuando queremos acceder a la dirección del servidor.

Errores encontrados y soluciones

En primera instancia resultó que el usuario del TFS no era el mismo usuario que tenía el application pool sobre el cual corría el sitio del TFS por lo que procedí a configurar el mismo usuario para ambas acciones. En la siguiente figura se ve el usuario configurado en el administrador del TFS.

image

Ahora vemos el Application Pool en el IIS con el mismo usuario configurado.

image

El siguiente error esta relacionado con SQL Server. En mi caso el TFS no podía ver el servidor de base de datos pese a que estaba en la misma máquina. Para solucionar este problema simplemente vamos a la opción de configuración de SQL Server y habilitamos conectividad vía Pipes para la instancia de la base de datos que estamos utilizando.

image

El último error esta relacionado con el puerto de instalación del TFS. Normalmente este utiliza el puerto 8080 para trabajar en el IIS; sin embargo, si ya tenemos otros sitios web en este servidor IIS el puerto también será utilizado por los otros sitios web que ya fueron creados, con lo cual no puede levantar el servicio del TFS. Para cambiar esto, seleccionamos el sitio web del TFS –> “ Team Foundation Server” y en la opción de enlaces o “Bindings” cambiamos el puerto de 8080 a 8081 – pudiendo ser cualquier otro puerto.

image

Luego de estos tres cambios ya puedo ver el sitio del TFS.

image

Etiquetas de Technorati: ,

12.10.2011

Aprendiendo WF parte 8 – Invocando métodos de otras clases en WF

Quizás la funcionalidad más común a la hora de trabajar con WF en una arquitectura n-layer sea invocar los métodos de los componentes de lógica de negocios. En este post vamos a ver como invocar un método que reside en otro componente.

El método a invocar

En primera instancia vamos a crear un método que recibe una colección de números y me devuelve los números pares. Este método estará en una clase aparte que se llamará MathHelper. El código de esta clase se puede ver en la siguiente figura:

image

El workflow que invoca el método BuscarPares

Ahora vamos a crear un workflow que va a requerir invocar el método BuscarPares de la clase MathHelper recién mostrada. Este workflow simplemente recibe la lista de los números enteros, los procesa – a través de la clase MathHelper – y retorna la lista solamente conteniendo números pares.

En el workflow creado por la aplicación de consola – Workflow Application – procedemos a crear dos argumentos:

  • Lista de entrada: pListaEntrada
  • Lista de Salida: pListaNumerosPares

image

Seguidamente procedemos a agregar una secuencia y luego de esto a agregar la figura que nos va a permitir invocar el método BuscarPares.

image

Como vemos en la figura anterior, nos falta configurar la figura InvokeMethod la cual nos va a permitir invocar el método BuscarPares en la clase MathHelper.

En este caso, tenemos tres parámetros por completar de manera visual los cuales tienen el siguiente significado:

  • TargetType: Este es el tipo de la clase que se va a utilizar en el caso de que se requiera invocar un método estático.
  • TargetObject: Este es el tipo de la clase que se va a utilizar en el caso de que se requiera invocar un método de instancia.
  • MethodName: El nombre del método a invocar.

En nuestro caso, como vamos a trabajar con un método de instancia tenemos que completar los campos TargetObject y MethodName.

Para el caso del targetObject vamos a tener que declarar una variable del tipo MathHelper dentro del workflow e instanciarla.

La creación de la variable se hace seleccionando la secuencia lanzada al workflow y digitando la variable en la parte inferior del workflow. La variable es la siguiente:

image

Para inicializar esta variable – para crear la instancia – procedemos con una figura del tipo Assign tal y como se ve a continuación:

image

Ahora procedemos a  configurar la figura de invocar método con la variable recién creada e inicializada.

image

Todavía nos falta configurar los parámetros de entrada y el retorno del método que vamos a invocar, para esto vamos a las propiedades de la figura InvokeMethod y configuramos ambos ítems. Primero establecemos que el retorno de la función será asignado a la lista pListaNumerosPares.

image

El siguiente paso es configurar los parámetros que debe recibir el método, la lista de los números a procesar. Para esto procedemos a seleccionar la propiedad “Parameters” y le damos click en la “elipsis” –> “…”. En esta pantalla procedemos a configurar el parámetro de envío.

image

Como vemos en la siguiente figura del workflow completo, este ya no tiene errores.

image

Ahora solo nos queda probar el workflow, para esto vamos a escribir el siguiente código en el método Main.

image

El resultado al ejecutar el código anterior es el siguiente:

image

Etiquetas de Technorati:

11.24.2011

Linq: TakeWhile y OrderBy

Trabajando con Linq, me ha tocado manipular colecciones de objetos en donde se deben aplicar condiciones a grupos de objetos o procesar objetos mientras se cumpla alguna condición. Un método que sin duda me llamó la atención es el TakeWhile el cual permite procesar los elementos mientras se cumpla la condición dada, si esta condición no se cumple, se descartan todos los elementos a partir del primero que no la cumpla.

Por ejemplo, queremos procesar la lista de productos cuyo precio sea menor de 500, todo esto basado en la siguiente clase de producto.

image

La lista de productos a procesar es la siguiente:

image

Ahora para poder cumplir con la condición inicial –> procesar los productos que cuestan menos de 500 <—y considerando que el método takeWhile detiene su procesamiento cuando la condición no se cumple, debemos ordenar la lista de productos retornada por precio, luego de esto vamos a aplicar el TakeWhile. Luego procedemos a retornar la lista resultante.

image

Al ejecutar el código anterior obtenemos el siguiente resultado:

image

Etiquetas de Technorati: ,,