Buenas herramientas para ASP .NET MVC

Al principio pensé en titular el post "Herramientas imprescindibles en ASP .NET MVC", pero dándole un par de vueltas, está claro que éstas son las herramientas que a mi me han funcionado y siendo sinceros puede que no sean las mejores y que no sean imprescindibles, así que lo dejaremos en herramientas que me hacen la vida más fácil cuando programo en ASP .NET MVC.

Una cosa que quiero dejar clara es que me cuesta mucho instalar paquetes adicionales en los entornos de programación. He sufrido en mis carnes el utilizar una u otra herramienta/API/extensión y luego que ésta sea un freno para su evolución, instalación o portabilidad. Intento ser lo más pragmático en mi programación posible y utilizar sólo aquellas herramientas que aportan valor y ayudan en tareas tediosas, siendo siempre posible eliminarlas y hacerlo a mano sin mucha complicación.

Mis buenas herramientas para ASP .NET MVC son:

  1. Automapper; como herramienta de mapeo de clases y objetos.
  2. Ninject: inyector de dependencias
  3. Moq: generador de mocks
  4. Specflow: Generación de test BDD usando el lenguaje Gherkin.

Cada uno soluciona uno de los problemas a los que me enfrento con frecuencia cuando hago un proyecto y la mayoría tienen que ver con el desacoplamiento entre clases y los test.

1. Automapper

Automapper es una herramienta para el mapeo de clases, es decir, me permite transformaciones de una clase a otra de forma estructurada y centralizada. Las principales ventajas son desacoplar la clase origen y destino y en concreto poder conectar de forma sencilla las clases que representan a objetos de datos (BD, EF, AR) con las clases de dominio.

Yo la utilizo principalmente para transformar las clases que genera Entity Framework desde las tablas de la BD (Model First) en sus correspondientes clases de dominio.  Como transformar PacienteBD en Paciente o Estudios en Exploraciones. Es muy intuitivo definir los mapers de forma global y luego aplicarlos en las funciones de los repositorios de datos.

¿Por qué utilizar Automapper en vez de una Fachada o un Adaptador? Pues por dos cosas principalmente: soporta colecciones y soporta estructura de Linq (IQueryable) lo que permite que las consultas de BD no se realicen hasta que se necesiten sus resultados. Si fuera necesario se podrían hacer de forma manual los mapeos y sacrificar rendimiento, pero sin perder funcionalidad en el tema de estructuras de datos y estructuras de Linq, pero ahora me soluciona mucho la conexión entre clases y de una forma sencilla, expresiva y limpia.

2. Ninject

Una necesidad que siempre tengo que cubrir es la inyección de dependencias. Desde el principio de cualquier aplicación es necesario poder invertir el control e intentar que las clases usen interfaces y no otras clases, de una forma u otra esto exige que haya herramientas que resuelvan estas dependencias. Para .NET hay varias alternativas como Unity, pero la verdad es que la simplicidad y sobre todo lo fácil que es explicar cómo funciona a alguien que nunca antes lo ha visto, me ha hecho decantarme por Ninject (también que la documentación es más directa que la de Unity).

La usamos para inyectar casi todo, pero en concreto los repositorios de datos y clases validadoras son típicos objetivos de la inversión de dependencias.

3. Moq

Seguramente la herramienta más conocida para definir Mocks. Los Mocks son esenciales a la hora de hacer test y simular la existencias de comportamiento al que no se tiene acceso como BD, archivos, apis de terceros, etc. Junto con Ninject permite definir buenos tests independientes y rápidos.

4. Specflow

De un tiempo a esta parte he estado trabajando con el concepto de BDD que me ha permitido enfocar de forma más natural TDD a nivel de aplicación, la transición entre historias de usuario a test es más natural y la jerarquía de tests por funcionalidad o feature más intuitiva. Es sin duda la herramienta de las anteriores que más me ha costado aprender y sacarle partido, pero quizás ahora es la que más necesitaría y menos podría eliminar de las anteriores. No podría hacer a mano lo que hago con Specflow, aunque reconozco que hay veces que hago TDD desde test unitarios cuando me es más fácil empezar por ellos.

Specflow define una estructura Given/When/Then (lenguaje Gherkin) en lenguaje natural (inglés) que posteriormente aplicando unas reglas muy sencillas de entender genera los esqueletos de los test correspondientes en la librería de test unitarios que quieras. La integración con el entorno de programación de VS2013 es total y su configuración y uso tiene cierta curva de aprendizaje pero luego cuando entiendes el lenguaje y las características se entiende y es sencillo de aplicar.

En este post he hablado de herramientas externas que aconsejo usar en proyectos de ASP .NET MVC, la mayoría están relacionadas con el desacople entre clases, los test y el intentar hacer código de calidad y limpio. Creo que sea cual sea vuestro proyecto o lenguaje, las ideas en las que se apoyan estas herramientas os ayudarán a hacer mejor código. Os animo a que las uséis en vuestros proyectos y descubráis sus análogas en otros lenguajes.

En otros post me gustaría hablar de TFS o VisualStudio Online, pero como estoy en el periodo de prueba de la versión completa y además quiero profundizar más en la plataforma, lo dejaré para más adelante.