Was ist der Sinn von Dependency Injection Frameworks?

8

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%     
ignaciofuentes 12.08.2010, 03:56
quelle

7 Antworten

4

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.

    
Justin Niessner 12.08.2010, 04:00
quelle
6

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.

    
Michael Shimmins 12.08.2010 04:02
quelle
1

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:

Was ist die Abhängigkeitsinjektion?

    
Leniel Macaferi 12.08.2010 04:03
quelle
0

Menschen verwenden Dependency-Injection-Frameworks, weil Sie sonst eine Tonne langweiliger, repetitiver Factory-Klassen schreiben müssen (wenn Sie Dependency-Injection verwenden).

Es kann gemacht werden, es ist nur sehr, sehr nervig.

    
kyoryu 12.08.2010 04:30
quelle
0

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:

  • Abhängigkeits-Lookup-Code kann von der Komponente entfernt werden.
  • Einige Frameworks, die eine automatische Verkabelung bieten, sparen Ihnen die manuelle Erstellung Ihrer Komponente Hierarchien (Antworten auf eine Ihrer Fragen)
  • Ermöglicht den Austausch von Implementierungen Ihrer Abhängigkeiten. (ohne Fabriken zu benutzen)
  • Testen (Ersetzen von Abhängigkeiten durch Scheinimplementierungen)

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

    
naikus 12.08.2010 04:49
quelle
0

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 ....:)

    
Matt 20.08.2010 16:00
quelle
0

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.

>     
Bradford Medeiros 01.08.2016 15:26
quelle