Das bedeutet, dass Objekte nur so viele Abhängigkeiten haben sollten, wie für die Erfüllung ihrer Aufgabe erforderlich sind, und dass die Abhängigkeiten gering sein sollten. Außerdem sollten die Abhängigkeiten eines Objekts nach Möglichkeit von Schnittstellen und nicht von "konkreten" Objekten bestehen. (Ein konkretes Objekt ist jedes Objekt, das mit dem Schlüsselwort new erstellt wird.) Lose Kopplung fördert die Wiederverwendbarkeit, erleichtert die Wartung und ermöglicht es Ihnen, anstelle von teuren Diensten einfach "Scheinobjekte" bereitzustellen.
Die "Dependency Injection" (DI), auch bekannt als "Inversion of Control" (IoC), kann als eine Technik zur Förderung dieser losen Kopplung verwendet werden.
Es gibt zwei Hauptansätze für die Implementierung von DI:
- Injektion des Konstruktors
- Setter-Injektion
Injektion des Konstruktors
Es ist die Technik der Übergabe von Abhängigkeiten von Objekten an ihren Konstruktor.
Beachten Sie, dass der Konstruktor eine Schnittstelle und kein konkretes Objekt annimmt. Beachten Sie auch, dass eine Ausnahme ausgelöst wird, wenn der Parameter orderDao null ist. Dies unterstreicht, wie wichtig es ist, eine gültige Abhängigkeit zu erhalten. Constructor Injection ist meiner Meinung nach der bevorzugte Mechanismus, um einem Objekt seine Abhängigkeiten zu geben. Dem Entwickler ist beim Aufruf des Objekts klar, welche Abhängigkeiten dem Objekt "Person" zur ordnungsgemäßen Ausführung übergeben werden müssen.
Setzer Injektion
Aber betrachten Sie das folgende Beispiel Angenommen, Sie haben eine Klasse mit zehn Methoden, die keine Abhängigkeiten haben, aber Sie fügen eine neue Methode hinzu, die eine Abhängigkeit von IDAO hat. Sie könnten den Konstruktor ändern, um Constructor Injection zu verwenden, aber das könnte Sie dazu zwingen, alle Konstruktoraufrufe überall zu ändern. Alternativ könnte man auch einfach einen neuen Konstruktor hinzufügen, der die Abhängigkeit übernimmt, aber wie soll ein Entwickler dann wissen, wann er den einen Konstruktor dem anderen vorziehen soll? Wenn die Erstellung der Abhängigkeit sehr teuer ist, warum sollte sie dann erstellt und an den Konstruktor übergeben werden, wenn sie nur selten verwendet wird? "Setter Injection" ist eine weitere DI-Technik, die in Situationen wie dieser eingesetzt werden kann.
Setter Injection erzwingt keine Übergabe von Abhängigkeiten an den Konstruktor. Stattdessen werden die Abhängigkeiten auf öffentliche Eigenschaften gesetzt, die das benötigte Objekt aufweist. Wie bereits angedeutet, sind die primären Beweggründe für diese Vorgehensweise folgende:
- Unterstützung von Dependency Injection, ohne den Konstruktor einer Legacy-Klasse ändern zu müssen.
- Teure Ressourcen oder Dienste werden so spät wie möglich und nur bei Bedarf geschaffen.
Hier ist ein Beispiel dafür, wie der obige Code aussehen würde:
public class Person {
public Person() {}
public IDAO Address {
set { addressdao = value; }
get {
if (addressdao == null)
throw new MemberAccessException("addressdao" +
" has not been initialized");
return addressdao;
}
}
public Address GetAddress() {
// ... code that uses the addressdao object
// to fetch address details from the datasource ...
}
// Should not be called directly;
// use the public property instead
private IDAO addressdao;
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