[IoC] Autoregistro de componentes con Autofac

Hace un tiempo le prometí a Jorge Serrano que escribiría un pequeño artículo sobre como auto-configurar un contenedor de dependencias. Vamos a empezar viendo los tipos de configuración que en mi opinión son los más conocidos:

Configuración vía fichero XML

Ventajas

  • Late Binding, es decir, nos permite cambiar dependencias sin tener que recompilar nuestro código, o lo que es lo mismo sustituir componentes en caliente.

Inconvenientes

  • Perdida de tipado fuerte. Como tenemos que manipular un fichero XML y no tenemos un IDE es fácil que podamos cometer un error tipográfico y al ejecutar nuestra aplicación nos encontremos con un error en tiempo de ejecución.
  • Mantenimiento del fichero XML. Tendremos que acordarnos de que allá donde despleguemos nuestra aplicación, el fichero de configuración tiene que estar o por el contrario fallará. Si por ejemplo tenemos una aplicación web con muchos frontales balenceados, si hacemos un cambio tendremos que repplicarlos en todos o tendremos un comportamiento anómalo.

Configuración vía código

Cuando usamos el método Register del contenedor y vamos registrando nuestras dependencias una a una.

Ventajas

  • Tipado fuerte. Al disponer de un IDE de desarrollo, tenemos toda la potencia del lenguaje tipado con intellisense y si cometemos un error tipográfico el IDE nos avisará y por supuesto nuestra solución no compilará.

Inconvenientes

  • Perdida de Late Binding, es decir, tendremos que recompilar nuestra aplicación si queremos sustituir un componente.

Y visto estas 2 alternativas, vamos a ver la que a día de hoy más me gusta personalmente y que no todo el mundo conoce, que es la Auto-Configuración , que es una mezcla de las 2 anteriores, entendiendo que el late binding lo podemos hacer escaneando una dll que ponemos en un directorio particular y cargando los componentes que implementan una interfaz, más o menos como lo hacen algunos CMS para extensibilidad (Creo que Orchard lo hace así).

En mi ejemplo voy a usar Autofac, un contenedor de dependencias con sabor a C# 3.0 como dice Scott Hanselman y que usando lambdas y métodos extensores vamos a ver de que manera tan fácil podemos autoregistrar dependencias.

Fijaos en este trozo de código:

private static IContainer GetContainer()
{
    var builder = new ContainerBuilder();
    builder.RegisterAssemblyTypes(typeof (ICommand).Assembly).
        Where(t => t.Name.EndsWith("Command")).
        AsImplementedInterfaces().
        Named(s => s.Name, typeof(ICommand));
 
    return builder.Build();
}

Lo que estoy haciendo es registrar en el contenedor todas los comandos de mi aplicación (En el próximo artículo os explicaré el patrón Command y veréis como encaja todo esto con un ejemplo real y completo), es decir todas las clases que implementan la interfaz ICommand y por lo tanto cada vez que añado un nuevo comando a mi aplicación no me tengo que preocupar de estar registrandolo, ya lo hace este método por mí. Con el Named lo que hago es dar un nombre conocido al commando para luego poder resolverlo, como os decía eso lo veremos en el siguiente artículo. Este autoregistro tienen una ventaja muy importante y es como dije anteriormente la extensibilidad de aplicaciones.

Un saludo y buen finde a todos.

Published 29/6/2012 11:56 por Luis Ruiz Pavón
Archivado en: ,,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2012/06/29/ioc-autoregistro-de-componentes-con-autofac.aspx

Comentarios

# re: [IoC] Autoregistro de componentes con Autofac

Buen artículo, Luis.

Una alternativa que suelo usar es hacer el 99% de la configuración por código usando convenciones (al estilo de lo que estás haciendo), pero dejar también un fichero xml externo, inicialmente vacío, con el que poder modificar la configuración de aplicaciones ya desplegadas para cosas puntuales.

Friday, June 29, 2012 3:01 PM por Juanma