Abhängigkeitsspritze

A diagram of an archetypical dependency injection container for the .NET platform.
Die Abhängigkeitsinjektion wird häufig neben speziellen Rahmenbedingungen verwendet, die als "Container" bezeichnet werden, um die Programmzusammensetzung zu erleichtern.

Im Softwareentwicklung, Abhängigkeitsspritze ist ein Designmuster in welchem ​​an Objekt oder Funktion Empfängt andere Objekte oder Funktionen, von denen es abhängt. Eine Form von Kontrollinversion, Abhängigkeitsinjektion zielt darauf ab die Bedenken trennen Objekte zu konstruieren und sie zu verwenden, was dazu führt zu lose gekoppelt Programme.[1][2][3] Das Muster stellt sicher, dass ein Objekt oder eine Funktion, die eine gegebene Verwendung verwenden möchte Service sollte nicht wissen, wie man diese Dienste erstellt. Stattdessen das Empfangen 'Klient'(Objekt oder Funktion) wird mit seinen Abhängigkeiten nach externen Code (ein' Injektor ') versehen, das es nicht bekannt ist.[4] Die Abhängigkeitsinjektion hilft, implizite Abhängigkeiten explizit zu machen und die folgenden Probleme zu lösen:[5]

  • Wie kann a Klasse unabhängig von der Schaffung der Objekte sein, von denen es abhängt?
  • Wie kann eine Anwendung und die Objekte, die sie verwendet, verschiedene Konfigurationen unterstützen?
  • Wie kann das Verhalten eines Code -Stücks geändert werden, ohne es direkt zu bearbeiten?

Grundsätzlich besteht die Abhängigkeitsinjektion aus Übergeben von Parametern an eine Methode.[6]

Weil der Kunde nicht erstellt oder Finden Sie den Service selbst muss es normalerweise nur das erklären Schnittstellen von den Dienstleistungen, die es nutzt, und nicht deren konkreten Implementierungen. Dies erleichtert die Änderung der Dienste, die tatsächlich zur Laufzeit verwendet werden, insbesondere in statisch getotische Sprachen Wenn das Ändern der zugrunde liegenden Objekte sonst den Quellcode neu kompiliert werden muss.

Ein Beispiel für die Inversion der Kontrolle ohne Abhängigkeitsinjektion ist die Template -Methodenmuster, wo Polymorphismus wird durch erreicht Unterklasse.[7] Im Gegensatz dazu implementiert die Abhängigkeitsinjektion die Inversion der Kontrolle durch Kompositionund ist oft ähnlich wie Strategiemuster. Ein Unterschied besteht darin, dass das Strategiemuster für Abhängigkeiten bestimmt ist, die während eines Objekts austauschbar sind Lebensdauerwährend mit Abhängigkeitsinjektion normalerweise nur eine einzelne Instanz einer Abhängigkeit verwendet wird.[8]

Rollen

Abhängigkeitsinjektion für Fünfjährige

Wenn Sie sich selbst aus dem Kühlschrank herausholen, können Sie Probleme verursachen. Sie könnten die Tür offen lassen, Sie könnten etwas Mama oder Papa haben, dass Sie nicht möchten. Möglicherweise suchen Sie sogar nach etwas, das wir nicht einmal haben oder das abgelaufen ist.

Was Sie tun sollten, ist ein Bedürfnis zu sagen: "Ich brauche etwas zum Mittagessen zu trinken", und dann werden wir sicherstellen, dass Sie etwas haben, wenn Sie sich hinsetzen, um sich zu essen.

John Munsch, 28. Oktober 2009.[2][9][10]

Die Abhängigkeitsinjektion umfasst vier Rollen: Dienstleistungen, Kunden, Schnittstellen und Injektoren.

Dienstleistungen und Kunden

Ein Dienst ist jede Klasse, die nützliche Funktionen enthält. Ein Kunde ist wiederum eine Klasse, die Dienste verwendet.

Jedes Objekt kann ein Dienst oder ein Kunde sein; Die Namen beziehen sich nur auf die Rolle, die die Objekte in einer Injektion spielen. Das gleiche Objekt ist möglicherweise sogar ein Client (er verwendet injizierte Dienste) und ein Dienst (er wird in andere Objekte injiziert). Bei der Injektion wird der Dienst Teil des Kunden erstellt Zustand, zur Verwendung verfügbar.[11]

Schnittstellen

Kunden sollten nicht wissen, wie ihre Abhängigkeiten implementiert werden, nur ihre Namen und API. Ein Dienst, der sendet E -Mailskann zum Beispiel die verwenden SMTP oder Pop3[zweifelhaft ] Protokolle hinter den Kulissen, aber dieses Detail ist wahrscheinlich irrelevant für den Aufruf von Code, der lediglich eine E -Mail sendet. Durch das Ignorieren von Implementierungsdetails müssen Kunden nicht ändern, wenn ihre Abhängigkeiten dies tun.

Injektoren

Das Injektor, manchmal auch als Assembler, Container, Anbieter oder Fabrik bezeichnet, stellt Dienste für den Kunden ein.

Die Rolle von Injektoren besteht darin, komplexe Objektdiagramme zu konstruieren und zu verbinden, in denen Objekte sowohl Clients als auch Dienste sein können. Der Injektor selbst kann viele Objekte sein, die zusammenarbeiten, dürfen aber nicht der Kunde sein, da dies eine erzeugen würde Zirkularabhängigkeit.

Da die Abhängigkeitsinjektion unterscheidet, wie Objekte aus ihrer Verwendung konstruiert werden, verringert sie häufig die Bedeutung des Neu Schlüsselwort in den meisten gefunden objektorientierte Sprachen. Da das Framework das Erstellen von Diensten übernimmt, neigt der Programmierer dazu, nur direkt zu konstruieren Wertobjekte die Einheiten im Programm des Programms repräsentieren (wie z. Angestellter Objekt in einer Business -App oder in einer Befehl Objekt in einer Einkaufs -App).[12][13][14][15]

Analogie

Als Analogie, Autos kann als Dienstleistungen betrachtet werden, die die nützliche Arbeit des Transports von Menschen von einem Ort zum anderen erbringen. Automotoren können erfordern Gas, Diesel- oder ElektrizitätAber dieses Detail ist für den Kunden - einen Fahrer - unwichtig, der sich nur dann darum kümmert, wenn es sie an sein Ziel bringen kann.

Autos präsentieren eine einheitliche Schnittstelle über ihre Pedale, Lenkräder und andere Steuerelemente. Als solches wurde der Motor, mit dem sie auf der Fabriklinie „injiziert“ wurden, auf Materie aufhört, und die Fahrer können nach Bedarf zwischen jeder Art von Auto wechseln.

Vorteile und Nachteile

Vorteile

Ein grundlegender Vorteil der Abhängigkeitsinjektion ist eine verringerte Kopplung zwischen Klassen und ihren Abhängigkeiten.[16][17]

Durch die Beseitigung des Kenntnisses eines Kunden darüber, wie seine Abhängigkeiten implementiert werden, werden Programme wiederverwendbarer, überprüfbarer und wartbarer.[18]

Dies führt auch zu einer erhöhten Flexibilität: Ein Kunde kann auf alles reagieren, was die intrinsische Schnittstelle unterstützt, die der Client erwartet.[19]

Allgemeiner reduziert sich die Abhängigkeitsinjektion Boilerplate -CodeDa alle Abhängigkeitskreationen von einer einzigartigen Komponente behandelt werden.[18]

Schließlich ermöglicht die Abhängigkeitsinjektion eine gleichzeitige Entwicklung. Zwei Entwickler können sich unabhängig entwickeln Klassen Das nutzt sich gegenseitig, während nur die Schnittstelle über die Klassen informiert werden muss. Plugins werden oft von Dritten entwickelt, die nie mit Entwicklern des ursprünglichen Produkts sprechen.[20]

Testen

Viele der Vorteile von Abhängigkeitsinjektion sind besonders relevant für Einheitstest.

Beispielsweise kann die Abhängigkeitsinjektion verwendet werden, um die Konfigurationsdetails eines Systems in Konfigurationsdateien zu externalisieren, sodass das System ohne Neukompilation neu konfiguriert werden kann. Separate Konfigurationen können für verschiedene Situationen geschrieben werden, die unterschiedliche Implementierungen von Komponenten erfordern.[21]

Da die Abhängigkeitsinjektion keine Änderung des Codeverhaltens erfordert, kann sie als Legacy -Code als a angewendet werden Refactoring. Dies macht Kunden unabhängiger und ist einfacher zu tun Gerätetest isoliert verwendet Stubs oder Scheinobjekte, die andere Objekte simulieren, die nicht testet werden.

Diese Erleichterung des Tests ist häufig der erste Nutzen, der bei der Verwendung der Abhängigkeitsinjektion bemerkt wird.[22]

Nachteile

Kritiker der Abhängigkeitsinjektion argumentieren, dass sie:

  • Erstellt Clients, die Konfigurationsdetails erfordern, was auf belastende Weise sein kann, wenn offensichtliche Standardeinstellungen verfügbar sind.[20]
  • Es schwierig, Code zu verfolgen, da er das Verhalten von der Konstruktion trennt.[20]
  • Wird normalerweise mit Reflexion oder dynamischer Programmierung implementiert, behindert Ide Automatisierung.[23]
  • Erfordert in der Regel mehr im Voraus Entwicklungsaufwand.[24]
  • Fördert die Abhängigkeit von einem Rahmen.[25][26][27]

Arten der Abhängigkeitsinjektion

Es gibt drei Hauptmethoden, wie ein Kunde injizierte Dienste erhalten kann:[28]

  • Konstruktorinjektion, bei der Abhängigkeiten über die Klasse eines Kunden bereitgestellt werden Konstrukteur.
  • Setter -Injektion, bei der der Client eine Settermethode enthüllt, die die Abhängigkeit akzeptiert.
  • Schnittstelleninjektion, wobei die Schnittstelle der Abhängigkeit eine Injektormethode bietet, die die Abhängigkeit in einen Client injiziert wird.

In einigen Frameworks müssen Kunden überhaupt nicht aktiv die Abhängigkeitsinjektion akzeptieren. Im JavaZum Beispiel kann Reflexion private Attribute beim Testen und Injektion von Diensten öffentlich machen.[29]

Ohne Abhängigkeitsinjektion

Im Folgenden Java Beispiel die Klient Klasse enthält a Service Mitgliedsvariable Initialisiert in der Konstrukteur. Der Client konstruiert und steuert direkt, welchen Service er verwendet, und erzeugt eine hartcodierte Abhängigkeit.

Öffentlichkeit Klasse Klient {       Privatgelände Beispieleservice Service;  Klient() {  Service = Neu Beispieleservice();  } } 

Konstruktorinjektion

Die häufigste Form der Abhängigkeitsinjektion besteht darin, dass eine Klasse ihre Abhängigkeiten durch ihre Anfrage anfordert Konstrukteur. Dies stellt sicher, dass sich der Kunde immer in einem gültigen Zustand befindet, da er nicht ohne seine notwendigen Abhängigkeiten instanziiert werden kann.

// Diese Klasse akzeptiert einen Dienst in seinem Konstruktor. Klient(Service Service) {       // Der Kunde kann überprüfen, ob seine Abhängigkeiten vor dem Bau der Konstruktion gültig sind.  wenn (Service == Null) {  Wurf Neu InvalyParameterexception("Der Service darf nicht null sein");  }  // Clients speichern in der Regel eine Referenz, damit andere Methoden in der Klasse darauf zugreifen können.  Dies.Service = Service; } 

Setterinjektion

Durch Akzeptieren von Abhängigkeiten durch a SettermethodeAnstelle eines Konstruktors können Kunden Injektoren jederzeit dazu bringen, ihre Abhängigkeiten zu manipulieren.

Dies bietet Flexibilität, macht es jedoch schwierig, sicherzustellen, dass alle Abhängigkeiten injiziert und gültig sind, bevor der Client verwendet wird.

// Diese Klasse bietet eine Methode, die eine Abhängigkeit akzeptiert. Öffentlichkeit Leere SetService(Service Service) {  Dies.Service = Service; } // Der Client kann seine Abhängigkeiten sofort oder in einer separaten Methode validieren. Privatgelände Leere validatestate() {  wenn (Service == Null) {  Wurf Neu Illegale staatliche Ausnahme("Der Service darf nicht null sein");  } } // Methode, die den Dienst nach der Überprüfung verwendet, ist gültig Öffentlichkeit Leere etwas tun() {  validatestate();  Service.mach dein Ding(); } 

Schnittstelleninjektion

Bei der Schnittstelleninjektion sind Abhängigkeiten ihre Kunden völlig nicht kennen und dennoch Verweise auf neue Kunden senden und empfangen.

Auf diese Weise werden die Abhängigkeiten Injektoren. Der Schlüssel ist, dass die Injektionsmethode über eine Schnittstelle bereitgestellt wird.

Ein Assembler wird weiterhin benötigt, um den Kunden und seine Abhängigkeiten vorzustellen. Der Assembler nimmt einen Verweis auf den Client, leitet ihn an die Setter-Schnittstelle, die diese Abhängigkeit festlegt, und übergibt sie an das Abhängigkeitsobjekt, das wiederum einen Referenz-zu-selbst-Rückgang an den Client übergibt.

Damit die Schnittstelleninjektion einen Wert hat, muss die Abhängigkeit etwas zusätzlich dazu tun, einfach einen Verweis auf sich selbst zurückzugeben. Dies könnte als Fabrik oder Subassembler dienen, um andere Abhängigkeiten zu lösen und so einige Details vom Hauptassembler abzuziehen. Es kann sich um eine Referenzbekämpfung handeln, damit die Abhängigkeit weiß, wie viele Kunden sie verwenden. Wenn die Abhängigkeit eine Sammlung von Kunden beibehält, könnte sie sie später alle mit einer anderen Instanz von sich selbst injizieren.

// Service Setter -Schnittstelle. Öffentlichkeit Schnittstelle Servicesetter {  Öffentlichkeit Leere SetService(Service Service); } // Client -Klasse Öffentlichkeit Klasse Klient Geräte Servicesetter {  // Interne Verweise auf den von diesem Client verwendeten Dienst.  Privatgelände Service Service;  // Legen Sie den Dienst fest, den dieser Kunde verwenden soll.  @Override  Öffentlichkeit Leere SetService(Service Service) {  Dies.Service = Service;  } } // Injektorklasse Öffentlichkeit Klasse Serviceinjektor { 	Satz<Servicesetter> Kunden; 	Öffentlichkeit Leere injizieren(Servicesetter Klient) { 		Kunden.hinzufügen(Klient); 		Klient.SetService(Neu Servicefoo()); 	} 	Öffentlichkeit Leere Switchtobar() { 		zum (Klient Klient : Kunden) { 			Klient.SetService(Neu ServiceBar()); 		} 	} } // Serviceklassen Öffentlichkeit Klasse Servicefoo Geräte Service {} Öffentlichkeit Klasse ServiceBar Geräte Service {} 

Montage

Die einfachste Möglichkeit zur Implementierung der Abhängigkeitsinjektion besteht darin, Dienste und Kunden manuell zu arrangieren, die normalerweise mit der „Wurzel“ des Programms durchgeführt werden, wo die Ausführung beginnt.

Öffentlichkeit Klasse Programm {  Öffentlichkeit statisch Leere hauptsächlich(Saite[] Args) {  // den Service bauen  Service Service = Neu Beispieleservice();  // Einmischen Sie den Dienst in den Kunden  Klient Klient = Neu Klient(Service);  // Verwenden Sie die Objekte  System.aus.println(Klient.grüßen());  }	 } 

Manuelle Konstruktion kann komplexer sein und beinhalten Bauherren, Fabriken, oder andere Baumuster.

Frameworks

A class diagram of dependency injection containers in the .NET Framework.
Behälter wie Ninject oder Structuremap werden üblicherweise in verwendet Objekt orientierte Programmierung Sprachen zu erreichen Kontrollinversion.

Die manuelle Abhängigkeitsinjektion ist häufig mühsam und fehleranfällig für größere Projekte, was die Verwendung von Frameworks fördert, die den Prozess automatisieren. Manuelle Abhängigkeitsinjektion wird zu einer Abhängigkeitsinjektion Rahmen Sobald der Konstruktionscode nicht mehr in die Anwendung individuell ist und stattdessen universell ist.[30] Obwohl diese Tools nützlich sind, sind diese Tools nicht erforderlich, um eine Abhängigkeitsinjektion durchzuführen.[31][32]

Einige Frameworks wie Frühling, können externe Konfigurationsdateien verwenden, um Programmzusammensetzung zu planen:

importieren org.springframework.bean.factory.beanfactory; importieren org.springframework.context.ApplicationContext; importieren org.springframework.context.support.classPathxMlApplicationContext; Öffentlichkeit Klasse Injektor { 	Öffentlichkeit statisch Leere hauptsächlich(Saite[] Args) { 		// Details darüber, welcher konkrete Dienst verwendet werden soll, werden in der Konfiguration getrennt vom Programm selbst gespeichert. 		Beanfaktor Beanfaktor = Neu ClassPathXMLApplicationContext("Beans.xml"); 		 		Klient Klient = (Klient) Beanfaktor.GetBean("Klient"); 		System.aus.println(Klient.grüßen()); 	} } 

Selbst mit einem potenziell langen und komplexen Objektdiagramm ist die einzige im Code erwähnte Klasse der Einstiegspunkt, in diesem Fall Klient.Klient hat keine Änderungen bei der Arbeit mit dem Frühling unterzogen und bleibt a Pojo.[33][34][35] Durch die Ausbreitung von federspezifischen Anmerkungen und Aufrufen von vielen Klassen bleibt das System nur lose vom Frühling abhängig.[26]

Beispiele

Angularjs

Das folgende Beispiel zeigt eine Angularjs Komponente erhält einen Grußservice durch Abhängigkeitsinjektion.

Funktion Someclass(Begrüßer) {  Dies.Begrüßer = Begrüßer; } Someclass.Prototyp.etwas tun = Funktion(Name) {  Dies.Begrüßer.grüßen(Name); } 

Jede AngularJS-Anwendung enthält einen Service-Locator, der für den Bau und die Suche von Abhängigkeiten verantwortlich ist.

// Geben Sie die Verkabelungsinformationen in einem Modul an var MyModule = eckig.Modul("MyModule", []); // Lehren Sie dem Injektor, wie man einen Begrüßerdienst baut.  // Begrüßer ist vom $ Window -Service abhängig. MyModule.Fabrik("Begrüßer", Funktion($ Fenster) {  Rückkehr {  grüßen: Funktion(Text) {  $ Fenster.Alarm(Text);  }  }; }); 

Wir können dann einen neuen Injektor erstellen, der Komponenten liefert, die in der definiert sind MyModule Modul, einschließlich des Begrüßungsdienstes.

var Injektor = eckig.Injektor["MyModule", 'ng']); var Begrüßer = Injektor.erhalten("Begrüßer"); 

Um das zu vermeiden Service Locator Antipattern, AngularJS ermöglicht eine deklarative Notation in HTML -Vorlagen, die die Erstellung von Komponenten an den Injektor delegiert.

<div ng-controller="MyController">  <Taste NG-Klick="sag Hallo()">HalloTaste> div> 
Funktion MyController($ Scope, Begrüßer) {  $ Scope.sag Hallo = Funktion() {  Begrüßer.grüßen('Hallo Welt');  }; } 

Das ng-controller Die Richtlinie löst den Injektor aus, um eine Instanz des Controllers und seiner Abhängigkeiten zu erstellen.

C#

Diese Probe liefert ein Beispiel für die Konstruktorinjektion in C#.

Verwendung System; Namespace Abhängigkeitsspritze; // Unser Client wird nur über diese Schnittstelle informiert, nicht welches bestimmte Gamepad er verwendet. Schnittstelle Igamepadfunktionalität {  Saite GetGamePadName();  Leere SETVIBRATIONPOWER(schweben In Kraft); } // Die folgenden Dienste bieten konkrete Implementierungen der obigen Schnittstelle. Klasse XboxGamePad : Igamepadfunktionalität {  schweben Vibrationskraft = 1.0f;       Öffentlichkeit Saite GetGamePadName() => "Xbox Controller";       Öffentlichkeit Leere SETVIBRATIONPOWER(schweben In Kraft) => Vibrationskraft = Mathematik.Klemme(In Kraft, 0,0f, 1.0f); } Klasse PlayStationJoystick : Igamepadfunktionalität {  schweben Vibrationspower = 100.0f;       Öffentlichkeit Saite GetGamePadName() => "PlayStation Controller";       Öffentlichkeit Leere SETVIBRATIONPOWER(schweben In Kraft) => Vibrationspower = Mathematik.Klemme(In Kraft * 100.0f, 0,0f, 100.0f); } Klasse SteamController : Igamepadfunktionalität {  doppelt Vibrieren = 1.0;       Öffentlichkeit Saite GetGamePadName() => "Steam Controller";       Öffentlichkeit Leere SETVIBRATIONPOWER(schweben In Kraft) => Vibrieren = Konvertieren.Verdoppeln(Mathematik.Klemme(In Kraft, 0,0f, 1.0f)); } // Diese Klasse ist der Client, der einen Dienst erhält. Klasse Gamepad {  Igamepadfunktionalität _Gamepadfunctionality;  // Der Dienst wird durch den Konstruktor injiziert und im obigen Feld gespeichert.  Öffentlichkeit Gamepad(Igamepadfunktionalität IngamePadfunctionality) => _Gamepadfunctionality = IngamePadfunctionality;  Öffentlichkeit Leere Vitrine()  {  // Der injizierte Dienst wird verwendet.  var Gamepadname = _Gamepadfunctionality.GetGamePadName();           var Botschaft = $ "Wir verwenden den {gamepadname} gerade, möchten Sie die vibrierende Leistung ändern?";           Konsole.Schreiben(Botschaft);  } } Klasse Programm {  statisch Leere Hauptsächlich()  {  var SteamController = Neu SteamController();           // Wir hätten auch in einem XboxController, PlayStationJoyStick usw. übergeben können.  // Das Gamepad weiß nicht, was es benutzt und was nicht.  var Gamepad = Neu Gamepad(SteamController);           Gamepad.Vitrine();  } } 

Siehe auch

Verweise

  1. ^ Seemann, Mark. "Die Abhängigkeitsinjektion ist locker gekoppelt". blog.ploeh.dk. Abgerufen 2015-07-28.
  2. ^ a b Seeman, Mark (Oktober 2011). Abhängigkeitsinjektion in .NET. Manning Publikationen. p. 4. ISBN 9781935182504.
  3. ^ Niko Schwarz, Mircea Lungu, Oscar Nierstrasz, „Seuss: Entkopplungsverantwortung aus statischen Methoden zur feinkörnigen Konfigurierbarkeit“, Journal of Object Technology, Band 11, Nr. 1 (April 2012), S. 3: 1-23
  4. ^ "HollywoodPrinciple". C2.com. Abgerufen 2015-07-19.
  5. ^ "Das Abhängigkeitsinjektionsmuster - Problem, Lösung und Anwendbarkeit". w3sdesign.com. Abgerufen 2017-08-12.
  6. ^ "Informationen an eine Methode oder einen Konstruktor übergeben (die Java ™ -Tutorials> Lernen der Java -Sprache> Klassen und Objekte)". docs.oracle.com. Abgerufen 2015-07-18.
  7. ^ "Inversion der Kontroll- und Abhängigkeitsinjektion". stackoverflow.com. Abgerufen 2015-08-05.
  8. ^ "Was ist der Unterschied zwischen Strategiemuster und Abhängigkeitsinjektion?". stackoverflow.com. Abgerufen 2015-07-18.
  9. ^ "Abhängigkeitsinjektion im Netz" (PDF). Philkildea.co.uk. p. 4. Abgerufen 2015-07-18.
  10. ^ "Wie kann man einem 5-Jährigen die Abhängigkeitsinjektion erklären?". stackoverflow.com. Abgerufen 2015-07-18.
  11. ^ I.T., Titan. "James Shore: Abhängigkeitsinjektion entmystifiziert". www.jamesshore.com. Abgerufen 2015-07-18.
  12. ^ "Zu" neu "oder nicht zu" neu "...". Abgerufen 2015-07-18.
  13. ^ "So schreiben Sie Testable Code". www.loosecoubings.com. Abgerufen 2015-07-18.
  14. ^ "Sauberer, prüfbarer Code schreiben". www.ethanresnick.com. Abgerufen 2015-07-18.
  15. ^ Sironi, Giorgio. "Wann zu injizieren: Die Unterscheidung zwischen Newable und Injectables - für das Auge unsichtbar". www.giorgioironi.com. Abgerufen 2015-07-18.
  16. ^ "Der städtische Canuk, EH: Zur Abhängigkeitsinjektion und Verstoß gegen die Verrückungsbedenken". www.bryancook.net. Abgerufen 2015-07-18.
  17. ^ "Das Abhängigkeitsinjektionsmuster". msdn.microsoft.com. Abgerufen 2015-07-18.
  18. ^ a b "Das Java Community Process (SM) -Programm - JSRS: Java -Spezifikationsanfragen - Detail JSR# 330". JCP.org. Abgerufen 2015-07-18.
  19. ^ "3.1. Abhängigkeitsinjektion - Python 3: Von keinem zu maschinellem Lernen". Archiviert von das Original am 2020-02-08.
  20. ^ a b c "Wie Abhängigkeitsinjektion (DI) in der Entwicklung von Spring Java Anwendungsentwicklung funktioniert - Dzone Java".
  21. ^ "Abhängigkeitsinjektion und Kontrolle der Kontrolle in Python - Abhängigkeitsinjektor 4.36.2 Dokumentation".
  22. ^ "Wie man für die Abhängigkeitsinjektion neu refaktor, Teil 3: Größere Anwendungen -".
  23. ^ "Ein kurzes Intro zur Abhängigkeitsinjektion: Was ist es und wann man sie benutzt". 18. Oktober 2018.
  24. ^ "Abhängigkeitsinjektion | professionqa.com".
  25. ^ "Was sind die Nachteile für die Verwendung von Abhängigkeitsinjektionen?". stackoverflow.com. Abgerufen 2015-07-18.
  26. ^ a b "Abhängigkeitsinjektionsinversion - Clean Codierer". Sites.google.com. Abgerufen 2015-07-18.
  27. ^ "Entkoppeln Ihrer Anwendung von Ihrem Abhängigkeitsinjektionsrahmen". Infoq. Abgerufen 2015-07-18.
  28. ^ Martin Fowler (2004-01-23). "Inversion der Kontrollbehälter und des Abhängigkeitsinjektionsmusters - Formen der Abhängigkeitsinjektion". Martinfowler.com. Abgerufen 2014-03-22.
  29. ^ "AccessibleObject (Java -Plattform SE 7)". docs.oracle.com. Abgerufen 2015-07-18.
  30. ^ Riehle, Dirk (2000), Framework -Design: Ein Vorbildungsansatz (PDF), Schweizer Federal Institute of Technology
  31. ^ "Abhängigkeitsinjektion! = Verwenden eines DI -Containers". www.loosecoubings.com. Abgerufen 2015-07-18.
  32. ^ "Schwarzer Schaf» diy-di »drucken". Blacksheep.parry.org. Archiviert von das Original Am 2015-06-27. Abgerufen 2015-07-18.
  33. ^ "Frühlingstipps: Ein Pojo mit Anmerkungen ist nicht einfach". Archiviert von das Original Am 2015-07-15. Abgerufen 2015-07-18.
  34. ^ "Anmerkungen in Pojo - ein Segen oder ein Fluch? | TechTracer". 2007-04-07. Abgerufen 2015-07-18.
  35. ^ Pro Spring Dynamic Module für OSGI -Serviceplattformen. Apress. 2009-02-17. ISBN 9781430216124. Abgerufen 2015-07-06.

Externe Links