2011-01-05 8 views
56

¿Cuál es el método sugerido para obtener el contenedor Autofac dentro de una clase en la aplicación? ¿Proporciona Autofac la resolución de una propiedad IContainer en una clase o necesito almacenar el contenedor de forma global una vez que lo he compilado?Resolver IContainer

Respuesta

88

Necesitará IComponentContext o ILifetimeScope para la mayoría de los propósitos. Estos son proporcionados automáticamente por Autofac, por lo que todo lo que necesita hacer es tomar una dependencia (constructor) en uno de ellos y se inyectará la instancia actual.

Ambas interfaces proporcionan las operaciones estándar Resolve(), mientras que ILifetimeScope amplían IComponentContext al agregar métodos para comenzar nuevas vidas anidadas.

Los componentes que deseen utilizar los servicios del contenedor para acceder a otros componentes deben hacerlo dentro de su propio alcance, en lugar de 'global' IContainer, para que se pueda devolver la instancia correcta. P.ej. dentro de una solicitud HTTP, la IComponentContext inyectada o ILifetimeScope será la de la solicitud actual.

La mayoría de los problemas que requieren un contexto insertado también se pueden superar (a menudo de forma más elegante) mediante el uso de tipos de relación: consulte: http://autofac.readthedocs.org/en/latest/resolve/relationships.html.

+1

Sería bueno tener en cuenta que existe una diferencia entre el auto-cableado de esa clase y la creación mediante un delegado. En mi caso, funcionó lo siguiente: 'builder.RegisterType ()' mientras que lo siguiente falló con una ObjectDisposedException en tiempo de ejecución una vez que se llamó 'IComponentContext':' builder.Register (c => new QueryProcessor (c)) ' . – Steven

+9

'builder.Register (c => new QueryProcessor (c))' necesita ser: 'builder.Register (c => new QueryProcessor (c.Resolve ()))' - 'c' es un temporal que vive por operación. HTH! –

Cuestiones relacionadas