2010-11-11 23 views
8

Soy nuevo en IoC y estoy jugando con Unity. Supongamos que tiene una solución con 'n' proyectos y desea usar Unity para registrar y resolver las dependencias. Digamos que su raíz de composición está en el proyecto a. Supongamos que tiene los siguientes proyectos en la solución.¿Cómo se manejan las dependencias 'profundas' con IoC y DI?

un b c d

digamos que un depende de algo en b, b depende de algo en c y c depende de algo en d

He visto cómo yo u puede utilizar la inyección de constructor para resolver el a => b dependencia pero estoy atascado en la forma dependencia de b en c puede resolverse sin acceso al contenedor que se ha configurado y creado en un proyecto .

¿Cuál es el enfoque para resolver las dependencias anidadas? ¿Existe un debate/blog/ejemplo que aborde la resolución de dependencias profundas?

+0

posible duplicado de [Pruebas unitarias e inyección de dependencia con dependencias profundamente anidadas] (http://stackoverflow.com/questions/4147018/unit-testing-and-dependency-injection-with-deeply-nested-dependencies) –

+0

Basado en el posible duplicado vinculado, si estoy en b y necesito una instancia de c, ¿le pediría al contenedor que resolviera la instancia? es decir: C c = container.resolve (); y si estoy en C ¿sigo el mismo patrón ... esto requeriría que todos los proyectos tengan acceso al contenedor ... ¿Es este un enfoque deseable? – jparram

+0

No, solo su proyecto de nivel más alto (una aplicación o un sitio web) debe hacer referencia a un contenedor. Las capas inferiores no deberían ni siquiera necesitar conocer las dependencias concretas. En otras palabras, dentro de C nunca deberías necesitar resolver una instancia concreta de una clase de D. ¿Tiene sentido eso? –

Respuesta

7

La raíz de su composición debe crear y entregar todas sus dependencias, incluidas las anidadas, por lo que necesita referencias para todos los ensamblajes relevantes (a menos que los suministre mediante reflexión). Por ejemplo, normalmente crea una instancia de B (proporcionando su dependencia, C) antes de crear un A. Si lo hizo 'by hand', que se vería así:

C c = new C(); 
B b = new B(c); 
A a = new A(b); 

Mientras se registra todos los tipos apropiados, su marco de inyección de dependencias resolverá para usted.

Para un excelente artículo sobre el tema, consulte "Dependency Injection Myth: Reference Passing" de Miško Hevery.

+0

Gracias por el enlace al artículo. Más o menos describió el concepto con el que estaba luchando. – jparram

+0

De nada; un montón de cosas hicieron clic para mí cuando leí ese artículo, y me alegra saber que me ayudó. –

Cuestiones relacionadas