Auf der Wikipedia-Seite zur Abhängigkeitsinjektion erfahren wir im Abschnitt zu den Nachteilen Folgendes:
Die Abhängigkeitsinjektion erhöht die Kopplung, indem der Benutzer eines Subsystems die Anforderungen dieses Subsystems erfüllen muss.
mit einem Link zu einem Artikel gegen Abhängigkeitsinjektion .
Die Abhängigkeitsinjektion bewirkt, dass eine Klasse die Schnittstelle anstelle der konkreten Implementierung verwendet. Das sollte zu einer verminderten Kopplung führen , nicht wahr?
Was vermisse ich? Wie erhöht die Abhängigkeitsinjektion die Kopplung zwischen Klassen?
dependency-injection
coupling
BЈовић
quelle
quelle
Antworten:
Die Abhängigkeitsinjektion verringert die Kopplung zwischen einer Klasse und ihrer Abhängigkeit. Es erhöht jedoch die Kopplung zwischen einer Klasse und ihrem Konsumenten (da der Konsument mehr Informationen benötigt, um sie zu erstellen) und der Abhängigkeit und ihrem Konsumenten (da der Konsument die zu verwendende Abhängigkeit kennen muss).
Sehr oft ist dies ein guter Kompromiss. Die Klasse sollte die Details zu ihren Abhängigkeiten über eine Schnittstelle hinaus nicht kennen und es sollte in der Verantwortung der Anwendung liegen, bestimmte Codebits miteinander zu verknüpfen.
quelle
Angenommen, Sie haben ein Subsystem
S
, das von einer Datenbankverbindung abhängtD
. Ohne Abhängigkeitsinjektion gibt es eine relativ enge Kopplung zwischenS
undD
, daS
beide wissen müssen, wie man es benutztD
und wie sie zu erstellen sind. Der Rest des Systems kann sich dieser Abhängigkeit zwischenS
und jedoch glücklicherweise nicht bewusst seinD
.Mit der Abhängigkeitsinjektion wird die Kopplung zwischen
S
undD
lockerer, weil Sie ausS
dem Wissen entfernen, wie man eineD
.S
muss nur wissen, wie man es benutzt. Die erhöhte Gesamtkopplung ergibt sich aus der Tatsache, dass andere Teile des Systems nun wissen müssenD
und möglicherweise wissen müssen, wie sie eines erstellen. Das Ausmaß dieser Zunahme der Kopplung hängt davon ab, wie stark die Abhängigkeit davon istD
injiziert wirdS
:S
eine Abhängigkeit vonD
und möglicherweise das Wissen, wie man eine erstellt.S
durch die eineD
Injektion erfolgt, eine Abhängigkeit vonD
und möglicherweise das Wissen, wie erstellt wird.In beiden Fällen müssen die Anzahl der Klassen, die von
D
der Erstellung abhängen , und das Wissen darüber, wie einD
Still erstellt wird, irgendwo im System vorhanden sein. Dies führt insgesamt zu einer Zunahme der Kopplung.quelle
S
Bedürfnisse einer Fabrik zu liefernD
, was bedeutet es , dass wissen mussS
VerwendungenD
(oder zumindest einige Schnittstelle davon).Ich bin absolut anderer Meinung, dass es die Kopplung erhöht.
Ohne Abhängigkeitsinjektion besteht eine enge Kopplung zwischen einem Teilsystem und der konkreten Implementierung der Abhängigkeit.
Mit der Abhängigkeitsinjektion haben Sie das Subsystem von der Implementierung der Abhängigkeit abgekoppelt.
Das Argument, dass es die Kopplung zwischen dem Verbraucher und diesem Teilsystem verstärkt, ist SEHR fraglich, da dies impliziert, dass der Verbraucher jetzt eng an die vom Teilsystem geforderte Abhängigkeit gekoppelt ist. Alles was es bedeutet ist, dass Sie eng gekoppelten Code schreiben, der Ihren Konsumenten an die Abhängigkeit koppelt. Idealerweise ist ALLER Code entkoppelt.
Konstruktor-Injektion:
Die Abhängigkeitsauflösung wird von einem Abhängigkeitsinjektionscontainer oder einer Fabrik übernommen. Der Verbraucher kann eine konkrete Implementierung des Teilsystems aus dem Abhängigkeitseinspritzbehälter oder einer Fabrik erhalten.
Der Verbraucher muss nicht wissen, wie der Konstruktor des Teilsystems überhaupt aussieht. Es besteht keine Kopplung an die Subsystemabhängigkeit.
Methode Injection:
Entspricht der Konstruktorinjektion, mit der Ausnahme, dass der Konsument jetzt eine konkrete Instanz der Abhängigkeit aus dem Container oder der Fabrik abrufen muss (oder sogar die Methode / den Konstruktor injizieren lassen muss) und sie in die Methode injizieren muss. Auch hier ist der Verbraucher nicht an eine konkrete Umsetzung der Abhängigkeit gekoppelt.
TL; DR Der schlimmste Fall für die Abhängigkeitsinjektion in einem Subsystem ist, dass die Kopplung auf Consumer-Code verschoben wird. ES GIBT KEINE ERHÖHUNG DER KUPPLUNG.
Der beste Fall ist, dass alle Systeme jetzt lose gekoppelt sind und die Abhängigkeitsinjektion über Abhängigkeitsinjektionsbehälter oder -fabriken gesteuert wird.
quelle