En mis últimos proyectos me he encontrado con que a medida que el proyecto crecía, acabábamos teniendo ficheros de configuración de dependencias enormes. Tanto si usábamos el contenedor de Unity o Ninject, necesitábamos registrar línea por línea cada una de las interfaces con la clase correspondiente que la implementaba:
Según crece la aplicación, se van añadiendo más y más servicios, repositorios, utilidades, etc. Además, cuanto más crece el método que registra estos servicios, más fácil es que nos olvidemos de corregir cualquier cambio al añadir nuevas dependencias y acabamos encontrando los errores en tiempo de ejecución.
Convención de nombres
En la mayoría de los casos, el nombre de dicha clase solía coincidir con el nombre de su interfaz sin la I inicial. Es decir, seguíamos la convención de nombres, pero no aprovechamos las características existentes de las librerías.
Tanto Unity como Ninject nos permiten escanear nuestros ensamblados y resolver automáticamente las dependencias usando la convención de nombres anterior, o incluso usar una convención propia para todo el proyecto o para un ensamblado concreto. Al añadir una nueva interfaz y su implementación, nos permite además que no necesitemos configurar nada salvo en los casos particulares en que no se respete la convención o queramos, por ejemplo, registrar el servicio como singleton.
Unity
Unity a partir de su versión 3.0, nos facilita la tarea de registrar las clases de nuestros ensamblados usando la convención de nombres. Por ejemplo:
Este código escaneará todos los ensamblados cargados en el proyecto en busca de interfaces y sus implementaciones para registrarlas en el contenedor de Unity. Además de este escaneo, se puede configurar qué ensamblados escanear, como mapear las interfaces o especificar el ciclo de vida en el contenedor. Leer más acerca de Registration by Convention.
Ninject
Para la librería Ninject existe también una extensión llamada ninject.extensions.conventions que permite registrar desde un ensamblado al igual que Unity:
Al igual que con Unity, esta extensión tiene diversas opciones para realizar el escaneo, pudiendo añadir particularidades o violaciones de la convención.
Versiones anteriores de Unity
Para versiones anteriores de Unity, existen librerías como UnityConfiguration para realizar el escaneo con convención de nombres. Un ejemplo de esta librería sería:
Al igual que en los casos anteriores, UnityConfiguration posee diversas opciones que permiten afinar como realizar el escaneo en nuestro proyecto.
Independientemente de la librería que utilicemos, utilizar la convención de nombres quita mucho trabajo a los desarrolladores y ayuda a la mantenibilidad del proyecto. Los ficheros de configuración podrán dejar de estar sobrecargados y es un buen punto de partida para paradigmas como “Convención sobre Configuración”.
Descubre cómo Sogeti puede ayudarte a implantar proyectos de Desarrollo de TI bajo tecnología Microsoft en tu compañía.
Más información:
.NET Architect | Soluciones Microsoft | SOGETI ESPAÑA
0 comments on “IOC: Registro por Convención de Nombres”