2010-03-29 14 views
6

(Esta pregunta no se basa en un marco específico COI, por lo que las interfaces y tipos en mis muestras son meta-tipos. Sólo reemplazarlos con los tipos apropiados para su marco favorito COI en su cabeza.)Dependency injection: ¿Cómo pasar el contenedor de inyección?

En mi métodos principales, normalmente configurar mi contenedor de hacer algo como esto:

static void Main() 
{ 
    IInjector in = new Injector(); 
    in.Register<ISomeType>().For<SomeType>(); 
    in.Register<IOtherType().For<OtherType>(); 
    ... 

    // Run actual application 
    App app = in.Resolve<App>(); 
    app.Run(); 
} 

mi pregunta es, ¿cómo se consigue el inyector envió alrededor? Normalmente solo había registrado el inyector y lo había inyectado en tipos que ellos mismos iban a inyectar, pero no estoy seguro de si este es el "patrón" adecuado.

Respuesta

14

No debe pasar el contenedor.

En cambio, su método de punto de entrada/principal le pregunta al contenedor por los objetos que necesita para comenzar, como su objeto de aplicación/bean. A continuación, el contenedor devuelve el gráfico de objetos completo conectado a App, que le permite ejecutar app.Run(), con todas las dependencias satisfechas.

Es un poco de un anti-patrón para los objetos a tener en cuenta el envase, o para cada objeto que se pide al contenedor para sus dependencias - si usted hace esto, entonces usted tiene no control invertidos y lo que no es una inyección de dependencia; todavía tiene objetos que le piden lo que necesita, en lugar de que le den lo que necesitan.

+1

Bien, ¿qué tal esto. La aplicación es un WinForm y tiene un botón que crea y muestra un formulario. Cada vez que se presiona este botón, se debe crear y mostrar una nueva instancia de este formulario. Este formulario tiene dependencias, por lo que debe ser resuelto por el formulario de la aplicación para cada instanciación. ¿Ahora que? – Alex

+2

@Alex: en este caso, puede usar "Proveedores" (fábricas especializadas) que mencioné en mi otra publicación. La diferencia entre inyectar un proveedor e inyectar el inyector completo es que esto limita fuertemente las dependencias indirectas "secretas". IOW, no degrada el inyector a un localizador de servicio. –

+0

@chris_l: Entonces, los "proveedores" pueden mantener el inyector alrededor, ¿verdad? De lo contrario, acabamos de mover el problema a otra parte. – Alex

2

Lo mejor es evitar inyectar el inyector. Simplemente cree los tipos que necesita y luego comience a ejecutar. He escrito una publicación algo más larga sobre este tema: Accessing the DI container

Cuestiones relacionadas