_Ich fand dieses lustige Beispiel in Bezug auf lose Kopplung :_
Quelle: Verständnis der Injektion von Abhängigkeiten
Jede Anwendung besteht aus vielen Objekten, die miteinander zusammenarbeiten, um nützliche Aufgaben zu erfüllen. Traditionell ist jedes Objekt für die Beschaffung seiner eigenen Verweise auf die abhängigen Objekte (Abhängigkeiten) verantwortlich, mit denen es zusammenarbeitet. Dies führt zu stark gekoppelten Klassen und schwer zu testendem Code.
Nehmen wir zum Beispiel eine Car
Objekt.
A Car
von Rädern, Motor, Kraftstoff, Batterie usw. abhängt, um zu funktionieren. Traditionell definieren wir die Marke solcher abhängigen Objekte zusammen mit der Definition der Car
Objekt.
Ohne Dependency Injection (DI):
class Car{
private Wheel wh = new NepaliRubberWheel();
private Battery bt = new ExcideBattery();
//The rest
}
Hier ist die Car
Objekt ist für die Erstellung der abhängigen Objekte zuständig.
Was ist, wenn wir den Typ des abhängigen Objekts ändern wollen - sagen wir Wheel
- nach der anfänglichen NepaliRubberWheel()
durchstochen? Wir müssen das Objekt Car mit seiner neuen Abhängigkeit neu erstellen, z. B. ChineseRubberWheel()
sondern nur die Car
Hersteller kann das tun.
Was bedeutet dann die Dependency Injection
für uns tun...?
Bei der Verwendung von Dependency Injection werden die Objekte mit ihren Abhängigkeiten versehen zur Laufzeit und nicht zur Kompilierzeit (Herstellungszeit des Autos) . Damit können wir nun die Wheel
wann immer wir wollen. Hier ist die dependency
( wheel
) kann injiziert werden in Car
während der Laufzeit.
Nach der Verwendung von Dependency Injection:
Hier sind wir Einspeisung die Abhängigkeiten (Rad und Batterie) während der Laufzeit. Daher auch der Begriff : Dependency Injection. Normalerweise verlassen wir uns auf DI-Frameworks wie Spring, Guice, Weld, um die Abhängigkeiten zu erstellen und bei Bedarf zu injizieren.
class Car{
private Wheel wh; // Inject an Instance of Wheel (dependency of car) at runtime
private Battery bt; // Inject an Instance of Battery (dependency of car) at runtime
Car(Wheel wh,Battery bt) {
this.wh = wh;
this.bt = bt;
}
//Or we can have setters
void setWheel(Wheel wh) {
this.wh = wh;
}
}
Die Vorteile sind:
- Entkopplung der Objekterzeugung (mit anderen Worten: Trennung der Nutzung von der Objekterzeugung)
- Möglichkeit, Abhängigkeiten zu ersetzen (z. B. Rad, Batterie), ohne die Klasse zu ändern, die sie verwendet (Auto)
- fördert den Grundsatz "Code to interface not to implementation".
- die Möglichkeit, während des Tests eine Mock-Abhängigkeit zu erstellen und zu verwenden (wenn wir während des Tests ein Mock von Wheel anstelle einer echten Instanz verwenden wollen).
0 Stimmen
Siehe meine Diskussion über Dependency Injection Hier .
44 Stimmen
Ich stimme den Kommentaren zu den Links zu. Ich kann verstehen, dass Sie vielleicht auf jemand anderen verweisen wollen. Aber fügen Sie zumindest hinzu, warum Sie sie verlinken und was diesen Link besser macht als die anderen Links, die ich mit Google finden könnte
0 Stimmen
@AR: Technisch gesehen, ist Dependency Injection no eine besondere Form von IoC. Vielmehr ist IoC eine Technik, die zur Bereitstellung von Dependency Injection verwendet wird. Es können auch andere Techniken für die Dependency Injection verwendet werden (obwohl IoC die einzige ist, die häufig verwendet wird), und IoC wird auch für viele andere Probleme verwendet.
157 Stimmen
Was die Links betrifft, so ist zu bedenken, dass sie oft auf die eine oder andere Weise verschwinden. Die Zahl der toten Links in SO-Antworten steigt. Egal, wie gut der verlinkte Artikel ist, er nützt nichts, wenn man ihn nicht finden kann.
0 Stimmen
Vojta Jina über Dependency Injection youtu.be/_OGGsf1ZXMs . Der erste Teil.
0 Stimmen
Ein Überblick über Dependency Injection und ihre Beziehung zu anderen OOP-Prinzipien: deviq.com/dependency-injection
0 Stimmen
Hier ist ein Anwendungsbeispiel ohne DI: tugay.biz/2017/05/standalone-jpa-beispiel-mit-hibernate.html und dasselbe mit DI: tugay.biz/2017/05/add-c3p0-to-previous-example.html