3581 Stimmen

Was ist Dependency Injection?

Es wurden bereits mehrere Fragen zu folgenden Themen gestellt Dependency Injection wie z. B. wann sie zu verwenden ist und welche Rahmenbedingungen es dafür gibt. Wie auch immer,

Was ist Dependency Injection und wann und warum sollte sie eingesetzt werden?

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.

3voto

mohit sarsar Punkte 169

Dependency Injection ist das Herzstück des Konzepts im Zusammenhang mit Spring Framework. Während der Erstellung des Rahmens eines Projekts kann Spring eine wichtige Rolle spielen, und hier kommt Dependency Injection in den Krug.

Eigentlich, Angenommen, in Java Sie erstellt zwei verschiedene Klassen als Klasse A und Klasse B, und was auch immer die Funktion in Klasse B verfügbar sind Sie in Klasse A verwenden möchten, so dass zu diesem Zeitpunkt Abhängigkeit Injektion verwendet werden kann. Sie können ein Objekt einer Klasse in einer anderen Klasse verankern, und auf die gleiche Weise können Sie eine ganze Klasse in eine andere Klasse injizieren, um sie zugänglich zu machen. Auf diese Weise können Abhängigkeiten überwunden werden.

BEI DER DEPENDENCY INJECTION WERDEN EINFACH ZWEI KLASSEN ZUSAMMENGEKLEBT UND GLEICHZEITIG GETRENNT GEHALTEN.

1voto

Ciro Corvino Punkte 1796

Injektion von Abhängigkeiten ist eine Art der Umsetzung des " Umkehrung der Kontrolle "Prinzip, auf dem das Frameworks Building basiert.

Rahmenwerke wie im "Design Pattern" der GoF angegeben, sind Klassen, die die Hauptkontrollflusslogik implementieren, was den Entwickler dazu veranlasst, dies zu tun, auf diese Weise realisieren Frameworks das Prinzip der Kontrollumkehr.

Ein Weg, um als Technik zu implementieren, und nicht als Klassenhierarchie, dieses IoC-Prinzip ist es nur Dependency Injection.

DI besteht hauptsächlich darin, das Mapping von Klasseninstanzen und Typreferenzen auf diese Instanzen an eine externe "Entität" zu delegieren: ein Objekt, eine statische Klasse, eine Komponente, ein Framework, etc.

Die Instanzen der Klassen sind die " Abhängigkeiten ", die externe Bindung der aufrufenden Komponente mit der Klasseninstanz durch die Referenz ist es die " Einspritzung ".

Natürlich kann man diese Technik in vielerlei Hinsicht vom OOP-Standpunkt aus implementieren, siehe zum Beispiel Konstruktor-Injektion , Setzereinspritzung , Interface-Injektion .

Die Delegierung der Aufgabe, eine Referenz einem Objekt zuzuordnen, an einen Dritten ist sehr nützlich, wenn Sie eine Komponente, die einige Dienste benötigt, vollständig von der Implementierung derselben Dienste trennen möchten.

Auf diese Weise können Sie sich bei der Entwicklung von Komponenten ausschließlich auf ihre Architektur und ihre spezifische Logik konzentrieren und sich auf Schnittstellen für die Zusammenarbeit mit anderen Objekten verlassen, ohne sich Gedanken über Änderungen bei der Implementierung der verwendeten Objekte/Dienste machen zu müssen, auch wenn das gleiche Objekt, das Sie verwenden, vollständig ersetzt wird (natürlich unter Beachtung der Schnittstelle).

1voto

DevTheJo Punkte 1919

Dependency Injection ist die Praxis, entkoppelte Komponenten agnostisch von einigen ihrer Abhängigkeiten zu machen, dies folgt dem SOLID Leitlinie, die besagt

Prinzip der Abhängigkeitsumkehr: Man sollte "von Abstraktionen abhängen, nicht von Konkretionen.

Die bessere Implementierung von Dependency Injection ist das Composition Root Design Pattern, da es Ihren Komponenten erlaubt, vom Dependency Injection Container entkoppelt zu werden.

Ich empfehle diesen großartigen Artikel über Composition Root http://blog.ploeh.dk/2011/07/28/CompositionRoot/ geschrieben von Mark Seemann

hier die wichtigsten Punkte aus diesem Artikel:

Eine Kompositionswurzel ist ein (vorzugsweise) eindeutiger Ort in einer Anwendung an dem Module zusammengesetzt werden.

...

Nur Anwendungen sollten Composition Roots haben. Bibliotheken und Frameworks sollten das nicht.

...

Ein DI-Container sollte nur von der Kompositionswurzel aus referenziert werden. Alle anderen Module sollten keinen Verweis auf den Container haben.

Die Dokumentation von Di-Ninja, einem Dependency Injection Framework, ist ein sehr gutes Beispiel dafür, wie die Prinzipien von Composition Root und Dependency Injection funktionieren. https://github.com/di-ninja/di-ninja Wie ich weiß, ist die einzige DiC in Javascript, die das Composition-Root Design Pattern implementiert.

1voto

王玉略 Punkte 1446

Können wir eine Dependency Injection durchführen, um sie zu kennen:

class Injector {
  constructor() {
    this.dependencies = {};
    this.register = (key, value) => {
      this.dependencies[key] = value;
    };
  }
  resolve(...args) {
    let func = null;
    let deps = null;
    let scope = null;
    const self = this;
    if (typeof args[0] === 'string') {
      func = args[1];
      deps = args[0].replace(/ /g, '').split(',');
      scope = args[2] || {};
    } else {
      func = args[0];
      deps = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m)[1].replace(/ /g, '').split(',');
      scope = args[1] || {};
    }
    return (...args) => {
      func.apply(scope || {}, deps.map(dep => self.dependencies[dep] && dep != '' ? self.dependencies[dep] : args.shift()));
    }
  }
}

injector = new Injector();

injector.register('module1', () => { console.log('hello') });
injector.register('module2', () => { console.log('world') });

var doSomething1 = injector.resolve(function (module1, module2, other) {
  module1();
  module2();
  console.log(other);
});
doSomething1("Other");

console.log('--------')

var doSomething2 = injector.resolve('module1,module2,', function (a, b, c) {
  a();
  b();
  console.log(c);
});
doSomething2("Other");

oben ist eine Implementierung von javascript

1voto

Yilmaz Punkte 12859

En Dependency Injection (DI) werden die Abhängigkeiten einer Komponente als Eingabe von einer externen Einheit bereitgestellt, die als injector . Ein Injektor erstellt Abhängigkeiten mithilfe von Anbietern. Anbieter sind Rezepte, die wissen, wie man Abhängigkeiten erstellt.

Der Injektor initialisiert die verschiedenen Komponenten und verknüpft ihre Abhängigkeiten miteinander. Dabei kann es sich um ein einfaches Initialisierungsskript oder einen anspruchsvolleren globalen Container handeln, der alle Abhängigkeiten abbildet und die Verkabelung aller Module des Systems zentralisiert. Der Hauptvorteil dieses Ansatzes ist die verbesserte Entkopplung, insbesondere bei Modulen, die von zustandsbehafteten Instanzen abhängen (z. B. einer Datenbankverbindung). Bei der Verwendung von DI wird jede Abhängigkeit, anstatt in das Modul hart kodiert zu werden, von außen empfangen. Das bedeutet, dass das abhängige Modul so konfiguriert werden kann, dass es jede kompatible Abhängigkeit verwendet, und dass das Modul selbst in verschiedenen Kontexten wiederverwendet werden kann. Dependency Injection erhöht die Flexibilität und Modularität in den Anwendungen. Die Verwendung in der Anwendung macht den Code flexibel, testbar und veränderbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X