Ich bin mir sicher, dass ich in diesem Bereich etwas verloren bin. Mein Verständnis ist, dass Dependency Injection bedeutet, etwas zu initialisieren, was beispielsweise von einer Klasse benötigt wird. Wenn mein Controller einen Dienst benötigt und ich ihn testen möchte, dann sollte ich zwei Constructor-Methoden dafür definieren ... also, meine Frage ist ... warum benutzen die Leute Frameworks um das zu erreichen? Ich bin verloren
%Vor%Personen verwenden kein Dependency Injection Framework, um den Code zu generieren, den Sie in Ihrem Beispiel angegeben haben. Das ist immer noch die Arbeit des Entwicklers.
Das Dependency Injection Framework wird verwendet, wenn jemand den Konstruktor aufruft. Das Framework injiziert die konkrete Implementierung des ICompaniesService, anstatt dass der Entwickler den Konstruktor explizit aufruft.
Obwohl es sich um ein bestimmtes Produkt handelt, hat die nInject Homepage tatsächlich einige wirklich gute Beispiele.
Ein Hauptgrund ist, Unit-Tests besser zu unterstützen und Objekte zu verspotten, um kontrollierte Tests zu erstellen.
Wenn Sie die Implementierung in der Klasse nicht angeben, können Sie eine Implementierung zur Laufzeit "injizieren". (In Ihrem Beispiel die ICompaniesService-Schnittstelle).
Zur Laufzeit können Sie mithilfe einer Inversion des Steuerungs- / Abhängigkeitsinjektionscontainers wie StructureMap, Unity oder Castle Windsor sagen: "Hey, wann immer jemand eine Instanz von ICompaniesService haben möchte, geben Sie ihm ein neues CompaniesService-Objekt".
Um diese Klasse Unit-Test zu testen, können Sie unseren ICompaniesService überspionieren und selbst dem Konstruktor zur Verfügung stellen. Auf diese Weise können Sie kontrollierte Methoden für das Mock-Objekt einrichten. Wenn Sie dies nicht tun könnten, würden Ihre Komponententests für CompaniesController darauf beschränkt sein, nur die eine Implementierung Ihres Unternehmensdienstes zu verwenden, die eine Live-Datenbank usw. treffen könnte, wodurch Ihre Komponententests sowohl langsam als auch inkonsistent werden.
Von Wikipedia :
Ohne den Begriff der Abhängigkeit Injektion, ein Verbraucher, der a bestimmter Service "ICompaniesService" um eine bestimmte Aufgabe erfüllen würde verantwortlich für den Umgang mit dem Lebenszyklus (instanziieren, öffnen und Schließen von Bächen, Entsorgen usw.) von dieser Dienst. Mit dem Konzept von Abhängigkeitsinjektion, jedoch die Lebenszyklus eines Dienstes wird von behandelt eine Abhängigkeit provider / framework (normalerweise a Container) und nicht der Verbraucher. Der Verbraucher müsste also nur ein Verweis auf eine Implementierung der Service "ICompaniesService" , den es benötigt, um Erfülle die notwendige Aufgabe.
Lesen Sie auch diesen:
Ich denke, dein Verständnis ist nur teilweise richtig. Dependency Injection ist "injizierend" eine Abhängigkeit einer Komponente darin. Es ist eine spezifischere Form der Inversion der Kontrolle. Während In diesem Prozess können einige Abhängigkeiten auch vor dem Injizieren initialisiert werden.
Bei DI besteht die Aufgabe des Nachschlagens der Abhängigkeit nicht in der Komponente (wie im ServiceLoacator-Muster), aber bis zum Container, in dem sich die Komponente befindet Laufen. Das Muster hat folgende Vorteile:
In Ihrem Codebeispiel kann eine Abhängigkeit von einem DI-Container zur Laufzeit über den zweiten injiziert werden Konstrukteur. Andere Injektionsformen sind ebenfalls möglich (abhängig vom DI-Behälter). z.B. Feldeinspritzung, Settereinspritzung usw.
Es gibt einen guten Artikel von Martin Fowler, der den Begriff DI geprägt hat
Sie müssen kein DI-Framework haben, aber irgendwann in Ihrer Codebasis muss eine konkrete Implementierung instanziiert und in Ihre Konstruktoren / Eigenschaften eingefügt werden. Es kann sehr chaotisch werden, wenn Sie kein DI-Framework haben, ich empfehle, Schloss Windsor zu betrachten, obwohl es, wie erwähnt, andere gibt, die die gleiche Funktionalität haben. Oder wenn Sie Ihre Rolle spielen könnten eigene ....:)
Ich werfe auf:
Sie können die Abhängigkeitsinjektion einfach durch eine parametrisierte Funktionsdefinition erreichen.
Um diese Arbeit jedoch konsistent zu machen, muss jeder dies tun. Viele finden, dass es einfacher ist, die Konvention durch die Verwendung eines Factory-Design-Patterns zu erzwingen.
Mit Hilfe von Dependency-Injection-Frameworks wird das Problem gelöst, dass das Schreiben dieser Fabriken reduziert wird.
Ich würde sagen, dass die Abhängigkeitsinjektion durch eine Fabrik nicht ideal ist. Meiner Meinung nach fügen Fabriken eine zusätzliche Ebene der Indirektion hinzu und machen in gewissem Sinne deterministische Funktionen indeterministisch in dem Sinne, dass sie nun eine Funktion der Eingaben sind, plus Status aus dem Rest des Programms (Ihrer di-Einstellung), die Sie nicht sehen können aus der Funktionsdefinition allein. Fabriken machen Code schwieriger, da sie eine zusätzliche Ebene der Indirektion hinzufügen. Ich würde argumentieren, dass es in vielen Fällen wirklich nicht schwer ist, der Konvention zu folgen und Klassen manuell über die Funktionsargumente zu injizieren. Für eine große Codebasis ist es jedoch wahrscheinlich einfacher, die Regel durch eine Factory zu erzwingen.
... manchmal frage ich mich, ob diese großen Codebasen sogar so groß sind, wenn sie nicht so viele Dinge schreiben, die versuchen, Probleme, die sie nicht haben, präventiv zu lösen.
>Tags und Links asp.net-mvc dependency-injection