2010-04-29 17 views
6

Estoy intentando averiguar cómo resolver una instancia en algún lugar del código.Ejemplo de resolución - Autofac

Al inicio de la aplicación que registró un tipo

static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

Ahora, ¿cómo puedo resolver una instancia en alguna parte del código?

En StructureMap no es un objeto estático ObjectFactory.GetInstance<IFoo>()

Respuesta

10

Lea sobre Getting Started. Debería comenzar.

En primer lugar, lo que usted está buscando es el container. Construirlo desde el ContainerBuilder como en esta sencilla aplicación de Windows Forms:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

La idea general es que sólo tiene que resolver la primera o la instancia superior. El contenedor manejará la creación de todas las demás instancias basadas en la inyección de dependencia a través de parámetros de constructor.

Si se sigue el patrón DI en toda la aplicación, solo debe tocar el contenedor una vez en el inicio.

La forma de resolver la instancia más alta depende en gran medida del tipo de aplicación que esté creando. Si es una aplicación web, ASP.Net integration y MVC integration se encargarán de eso. (Después de todo, la instancia superior en ASP.Net es Application que está fuera de nuestro control).

Por otro lado, si es una aplicación de consola o una aplicación de WinForms resolvería la primera instancia manualmente en Main, como mi ejemplo anterior.

+0

Ese es el ejemplo, pero ¿qué sucede si necesito una instancia en más clases? No se puede registrar el tipo en cada clase. – user137348

+1

Pero de alguna manera debes resolver esta instancia superior en algún lugar del código. Los tipos se registran al inicio (Global.asax) y luego necesita resolver la instancia superior en algún lugar del código. Finalmente, encontré un artículo que describe esto. http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx ¿Qué opina de este enfoque? – user137348

+0

Vea mi respuesta actualizada ... y sí, el enfoque de @Sharpoverrides está bien, se asegura de que Global.asax no esté repleto de código de construcción de contenedores. Después de todo, debería escribir pruebas de unidad que prueben el contenedor, y tener una clase de responsabilidad única que construya el contenedor facilita la prueba. –