2010-03-29 3 views
6

(für Ihren Lieblings IoC-Framework in Ihrem Kopf Diese Frage beruht nicht auf einer bestimmten IoC-Framework, so dass die Schnittstellen und Typen in meinen Mustern sind Meta-Typen. Gerade sie mit den entsprechenden Typen ersetzen.)Abhängigkeitsinjektion: Wie wird der Injektionsbehälter herumgeführt?

In meinem Hauptmethoden, ich aufgebaut typischerweise mein Behälter so etwas wie dies zu tun:

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(); 
} 

Meine Frage ist, wie Sie den Injector um geschickt bekommen? Normalerweise habe ich den Injektor nur mit sich selbst registriert und ihn in Typen injiziert, die selbst injizieren werden, aber ich bin mir nicht sicher, ob dies das richtige "Muster" ist.

Antwort

14

Sie sollten den Container nicht passieren.

Stattdessen Ihr Einstiegspunkt/main-Methode fragt den Container für die Objekte loszulegen es muss - wie Ihre App-Objekt/Bohne. Der Container gibt dann das vollständige Objektdiagramm zurück, das mit App verbunden ist. Dadurch können Sie app.Run() ausführen, wobei alle Abhängigkeiten erfüllt sind.

Es ist ein bisschen ein anti-Muster für die Objekte bewusst des Behälters zu sein, oder für jedes Objekt zu fragen, den Behälter werden, damit es Abhängigkeiten ist - wenn Sie dies tun, dann haben Sie nicht invertierte Steuer und was Sie have ist nicht dependency injection - Sie haben immer noch Objekte, die sich fragen, was sie brauchen, anstatt ihnen das zu geben, was sie brauchen.

+1

Okay, wie wäre es damit. Die App ist ein WinForm und hat eine Schaltfläche, die ein Formular erstellt und anzeigt. Jedes Mal, wenn diese Schaltfläche gedrückt wird, sollte eine neue Instanz dieses Formulars erstellt und angezeigt werden. Da dieses Formular Abhängigkeiten aufweist, muss es für jede Instanziierung vom Anwendungsformular aufgelöst werden. Was jetzt? – Alex

+2

@Alex: In diesem Fall können Sie "Providers" (spezialisierte Fabriken) verwenden, die ich in meinem anderen Beitrag erwähnt habe. Der Unterschied zwischen dem Injizieren eines Providers und dem Injizieren des gesamten Injektors besteht darin, dass dies die indirekten "geheimen" Abhängigkeiten stark einschränkt. IOW, es degradiert den Injektor nicht zu einem Service Locator. –

+0

@chris_l: Also dann "Providers" kann den Injector herum halten, oder? Sonst haben wir das Problem einfach anderswo verschoben. – Alex

2

Am besten injizieren Sie den Injektor nicht. Erstellen Sie einfach die benötigten Typen und starten Sie dann die Ausführung. Ich habe einen etwas längeren Beitrag zu diesem Thema geschrieben: Accessing the DI container

Verwandte Themen