2012-03-26 17 views
6

Estoy trabajando en una aplicación que consta de muchos módulos, y algunos tienen dependencias en otros módulos. Decidí usar Autofac para resolver dependencias circulares y mejorar la arquitectura en general.autofac: uso correcto en la aplicación de varios módulos

Para configurar autofac, utilizo el método xml (http://code.google.com/p/autofac/wiki/XmlConfiguration).

Ahora no estoy seguro de cómo implementar Autofac. ¿Debo tener una referencia a autofac en cada módulo de mi aplicación? Lo que significa que tengo que registrar todos los componentes cada vez que quiero resolver una dependencia ...

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterModule(new ConfigurationSettingsReader("autofac", configPath)); 
IContainer container = builder.Build(); 
IWhatever w = container.Resolve<IWhatever>(); 

¿Es esta la manera de hacerlo?

¿O es mejor ajustar Autofac en un Módulo separado? Con este enfoque tendría que registrar los módulos de una sola vez (cuando se inicia la aplicación) y apenas podía usar el Autofac envuelta para resolver dependencias ...

IWhatever w = container.Resolve<IWhatever>(); 

espero alguien me puede decir la mejor manera de utilizar Autofac.

gracias!

+2

La mejor manera de utilizar Autofac (o cualquier otro contenedor DI) es para referenciarlo tan raramente como sea necesario. [Esta respuesta] (http://stackoverflow.com/a/1410738/644812) podría ser útil. –

+0

gracias, eso es lo que estoy pensando también. Simplemente no estoy seguro de cuál es la mejor práctica para usar Autofac ... – Fabian

Respuesta

-1

El módulo separado para contenedor no es solo una mejor opción, es la única opción correcta. Las instancias de contenedor de ICA de AFAIK deben ser únicas.

Al menos he usado Unity de esta manera: crea una instancia estática de contenedor públicamente disponible, la inicializa al iniciar la aplicación y luego la accede desde todos sus módulos.

+4

No, no y no. Tener un singleton (de cualquier cosa) rara vez es una buena idea. En la mayoría de los casos, hay una mejor solución. Lo mismo aqui. – jgauffin

+0

¿Y cuál es, usted no ha proporcionado uno? No puede usar el código provisto en la pregunta en cada módulo porque esto creará muchos sobrecargas. No estoy seguro, pero es posible que el generador de llamadas. Construya crea una instancia de todos los objetos en el contenedor, una muy mala idea. – vlad2135

+2

¿Una gran cantidad de gastos generales? El contenedor se construye una vez en la vida útil de una aplicación. – jgauffin