2010-11-11 3 views
8

Sono nuovo di IoC e sto giocando con Unity. Supponiamo che tu abbia una soluzione con progetti "n" e tu voglia usare Unity per registrare e risolvere le dipendenze. Diciamo che la tua radice composizione è nel progetto a. Supponiamo che tu abbia i seguenti progetti nella soluzione.Come gestite le dipendenze "profonde" con IoC e DI?

un b c d

Diciamo un dipende qualcosa in b, b dipende da qualcosa in c e c dipende da qualcosa in d

Ho visto come si u possibile utilizzare l'iniezione di costruzione per risolvere il a => b dipendenza, ma io sono bloccato su come di B dipendenza c può essere risolto senza l'accesso al contenitore che è stato configurato e creato nel progetto un.

Qual è l'approccio per la risoluzione delle dipendenze nidificate? Esiste un dibattito/blog/esempio che risolva la risoluzione delle dipendenze profonde?

+0

possibile duplicato di [Test unità e iniezione dipendenza con dipendenze profondamente nidificate] (http://stackoverflow.com/questions/4147018/unit-testing-and-dependency-injection-with-deeply-nested-dependencies) –

+0

basato sul possibile duplicato collegato, se sono in b e ho bisogno di un'istanza di c, chiederei al contenitore di risolvere l'istanza? es .: C c = container.resolve (); e se sono in C, seguo lo stesso schema ... questo richiederebbe a tutti i progetti di avere accesso al contenitore ... È un approccio desiderabile? – jparram

+0

No, solo il progetto di livello più alto (un'applicazione o un sito Web) deve fare riferimento a un contenitore. Gli strati inferiori non dovrebbero nemmeno sapere di dipendenze concrete. In altre parole, all'interno di C non dovrebbe mai essere necessario risolvere un'istanza concreta di una classe da D. Ha senso? –

risposta

7

La root di composizione deve creare e distribuire tutte le dipendenze, comprese quelle annidate, quindi ha bisogno di riferimenti a tutti gli assembly rilevanti (a meno che non li stiate fornendo utilizzando la reflection).

Ad esempio, in genere si crea un'istanza di B (che fornisce la sua dipendenza, C) prima di creare uno A. Se l'avete fatto 'by hand', sarebbe simile a questa:

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

Finché si registra tutti i tipi appropriati, il framework iniezione di dipendenza li risolvere per voi.

Per un grande articolo sull'argomento, vedere "Dependency Injection Myth: Reference Passing" di Miško Hevery.

+0

Grazie per il link all'articolo. Ha praticamente descritto il concetto con cui stavo lottando. – jparram

+0

Prego, molte cose mi sono scattate quando ho letto quell'articolo e sono lieto di sapere che ha aiutato. –