Erstens bin ich ein Programmierer der Einstiegsklasse. Tatsächlich beende ich im Sommer ein AS-Studium mit einem Abschlussprojekt. Wenn ich in meinem neuen Job kein Projekt für mich habe (sie warten darauf, das Team mit weiteren Neueinstellungen zu füllen), habe ich Bücher zum Lesen und Lernen erhalten, während ich warte - einige Lehrbücher, andere nicht so sehr (wie Code Complete). Nachdem ich diese Bücher durchgesehen hatte, wandte ich mich dem Internet zu, um so viel wie möglich zu lernen, und fing an, etwas über SOLID und DI zu lernen (wir sprachen über das Substitutionsprinzip von Liskov, aber nicht über viele andere SOLID-Ideen). Wie ich gelernt habe, habe ich mich hingesetzt, um besser zu lernen, und angefangen, Code zu schreiben, um DI von Hand zu verwenden (es gibt keine DI-Frameworks auf den Entwicklungscomputern).
Während ich es tue, bemerke ich, dass es sich vertraut anfühlt ... und es scheint sehr ähnlich zu sein, wie ich es in der Vergangenheit mit der Komposition abstrakter Klassen unter Verwendung von Polymorphismus getan habe. Vermisse ich hier ein größeres Bild? Gibt es etwas an DI (zumindest von Hand), das darüber hinausgeht? Ich verstehe die Möglichkeit, dass Konfigurationen, die nicht im Code einiger DI-Frameworks enthalten sind, einige große Vorteile haben, wenn es darum geht, Dinge zu ändern, ohne sie neu kompilieren zu müssen, aber wenn ich sie von Hand mache, bin ich mir nicht sicher, ob sie anders sind als oben angegeben ... Ein Einblick in diese wäre sehr hilfreich!
quelle
Der beste Artikel, den ich jemals zu diesem Thema gelesen habe, war der von James Shore . Ich mache seit Ewigkeiten " DI by Hand " als Teil von Abstraktion und Polymorphismus. Nachdem ich in die Berufswelt eingetreten war und immer wieder hörte, dass dieser Begriff herumgeworfen wurde, hatte ich eine große Kluft zwischen dem, was das Wort meiner Meinung nach bedeuten sollte und dem, was es tatsächlich bedeutet:
Das ist von Shores Post, der alles für mich geklärt hat. Beispielsweise:
Gegeben
Anstatt zu schreiben:
Du schreibst so etwas:
Dies verhindert, dass die
Car
Instanz bestimmteEngine
Details verarbeiten muss. Ein Auto braucht nur einen Motor, es ist egal, welcher, solange es die grundlegende Motorfunktionalität implementiert. Das heißt, IhreCar
Klasse ist nicht an eine bestimmte Implementierungsabhängigkeit gebunden. Es wird an anderer Stelle "injiziert", möglicherweise zur Laufzeit.In diesem speziellen Car-Beispiel wird der DI-Untertyp "Constructor Injection" verwendet, was nur bedeutet, dass die Abhängigkeit als Konstruktorargument übergeben wurde. Sie können auch eine
setEngine(Engine a)
Methode für "Setter Injection" usw. verwenden, aber diese Untertypen erscheinen mir pedantisch.Ein bisschen weiter bieten viele DI-Frameworks die Boilerplate, um eine Reihe dieser abstrakter referenzierten Dinge miteinander zu verbinden.
Das ist es.
quelle
Ich bin kein Experte, da ich erst in den letzten Jahren angefangen habe, DI zu verwenden, aber einige der nützlichen Themen / Funktionen von DI-Behältern, die mir aufgefallen sind, sind (die ich nicht als Produkte der Zusammensetzung / des Polymorphismus betrachte (aber ich kann das korrigieren):
quelle
Abgesehen von DI gibt es in der Stammanwendung eine Konfiguration für die Klassenzusammensetzung (anstatt mit XML zu konfigurieren). Es ist kein DI- oder IoC-Framework erforderlich, obwohl sie die Konfiguration der Klassenzusammensetzung aufräumen können, insbesondere bei großen Projekten. Dies liegt daran, dass das DI-Framework normalerweise mit einem Container geliefert wird, der zusätzliche Funktionen implementiert, z. B. die automatische Verkabelung, mit deren Hilfe die Klassenzusammensetzung konfiguriert werden kann. Sie können meinen Blogeintrag lesen , um mein Verständnis zu diesem Thema zu extrahieren.
quelle