Zunächst möchte ich den Designansatz vom Konzept der Frameworks trennen. Die Abhängigkeitsinjektion auf ihrer einfachsten und grundlegendsten Ebene ist einfach:
Ein übergeordnetes Objekt stellt alle Abhängigkeiten bereit, die für das untergeordnete Objekt erforderlich sind.
Das ist es. Beachten Sie, dass dazu keine Schnittstellen, Frameworks, Injektionsarten usw. erforderlich sind. Um fair zu sein, habe ich dieses Muster vor 20 Jahren kennengelernt. Es ist nicht neu
Aufgrund der Verwirrung von mehr als 2 Personen über den Begriff Elternteil und Kind im Zusammenhang mit der Abhängigkeitsinjektion:
- Das übergeordnete Objekt instanziiert und konfiguriert das verwendete untergeordnete Objekt
- Das Kind ist die Komponente, die passiv instanziiert werden soll. Das heißt, es wurde entwickelt, um die vom übergeordneten Element bereitgestellten Abhängigkeiten zu verwenden, und es instanziiert keine eigenen Abhängigkeiten.
Abhängigkeitsinjektion ist ein Muster für das Objekt Zusammensetzung .
Warum Schnittstellen?
Schnittstellen sind ein Vertrag. Sie existieren, um zu begrenzen, wie eng zwei Objekte miteinander verbunden sein können. Nicht jede Abhängigkeit benötigt eine Schnittstelle, aber sie hilft beim Schreiben von modularem Code.
Wenn Sie das Konzept des Komponententests hinzufügen, haben Sie möglicherweise zwei konzeptionelle Implementierungen für eine bestimmte Schnittstelle: das reale Objekt, das Sie in Ihrer Anwendung verwenden möchten, und das verspottete oder gestoppelte Objekt, das Sie zum Testen von Code verwenden, der vom Objekt abhängt. Das allein kann für die Schnittstelle eine Rechtfertigung sein.
Warum Frameworks?
Das Initialisieren und Bereitstellen von Abhängigkeiten für untergeordnete Objekte kann bei einer großen Anzahl von Objekten schwierig sein. Frameworks bieten die folgenden Vorteile:
- Autodraht-Abhängigkeiten zu Komponenten
- Konfiguration der Komponenten mit irgendwelchen Einstellungen
- Automatisieren Sie den Kesselschildcode, damit Sie ihn nicht an mehreren Stellen schreiben müssen.
Sie haben auch die folgenden Nachteile:
- Das übergeordnete Objekt ist ein "Container" und enthält keinen Code
- Das Testen wird komplizierter, wenn Sie die Abhängigkeiten nicht direkt in Ihrem Testcode angeben können
- Die Initialisierung kann verlangsamt werden, da alle Abhängigkeiten mithilfe von Reflexion und vielen anderen Tricks aufgelöst werden
- Das Debuggen zur Laufzeit kann schwieriger sein, insbesondere wenn der Container einen Proxy zwischen die Schnittstelle und die eigentliche Komponente einfügt, die die Schnittstelle implementiert (in Spring integrierte aspektorientierte Programmierung). Der Container ist eine Black Box, und sie werden nicht immer mit dem Konzept erstellt, den Debugging-Prozess zu vereinfachen.
Trotzdem gibt es Kompromisse. Für kleine Projekte, bei denen es nicht viele bewegliche Teile gibt und es keinen Grund gibt, ein DI-Framework zu verwenden. Bei komplizierteren Projekten, bei denen bestimmte Komponenten bereits für Sie erstellt wurden, kann der Rahmen jedoch gerechtfertigt sein.
Was ist mit [zufälliger Artikel im Internet]?
Was ist damit? Oft können die Leute übereifrig werden und eine Reihe von Einschränkungen hinzufügen und dich beschimpfen, wenn du Dinge nicht auf die "einzig wahre Weise" tust. Es gibt keinen wahren Weg. Sehen Sie nach, ob Sie aus dem Artikel etwas Nützliches extrahieren und die Dinge ignorieren können, mit denen Sie nicht einverstanden sind.
Kurz gesagt, denken Sie selbst und probieren Sie es aus.
Arbeiten mit "alten Köpfen"
Lerne so viel wie du kannst. Bei vielen Entwicklern, die in den Siebzigern arbeiten, werden Sie feststellen, dass sie gelernt haben, in vielen Dingen nicht dogmatisch zu sein. Sie haben Methoden, mit denen sie jahrzehntelang gearbeitet haben und die korrekte Ergebnisse liefern.
Ich hatte das Privileg, mit einigen von ihnen zu arbeiten, und sie können einige brutal ehrliche Rückmeldungen geben, die sehr viel Sinn ergeben. Und wo sie Wert sehen, erweitern sie ihr Repertoire um diese Werkzeuge.