<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dependency_Injection</id>
	<title>Dependency Injection - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dependency_Injection"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dependency_Injection&amp;action=history"/>
	<updated>2026-05-22T02:28:45Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Dependency_Injection&amp;diff=454914&amp;oldid=prev</id>
		<title>imported&gt;Lu12r: /* growthexperiments-addlink-summary-summary:3|0|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dependency_Injection&amp;diff=454914&amp;oldid=prev"/>
		<updated>2024-09-26T09:42:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:3|0|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Belege fehlen|2=Einige Teile dieses Artikels|Plural=1}}&lt;br /&gt;
&lt;br /&gt;
Als &amp;#039;&amp;#039;&amp;#039;Dependency Injection&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;DI&amp;#039;&amp;#039;&amp;#039;, {{enS|dependency}} ‚Abhängigkeit‘ und &amp;#039;&amp;#039;{{lang|en|injection}}&amp;#039;&amp;#039; ‚Injektion‘, {{deS|Abhängigkeitsinjektion}}&amp;lt;ref&amp;gt;[https://docs.microsoft.com/de-de/aspnet/core/fundamentals/dependency-injection Dependency Injection in ASP.NET Core], Microsoft Docs&amp;lt;/ref&amp;gt; oder &amp;#039;&amp;#039;Einbringen von Abhängigkeiten&amp;#039;&amp;#039;) wird in der [[Objektorientierte Programmierung|objektorientierten Programmierung]] ein [[Entwurfsmuster]] bezeichnet, welches die Abhängigkeiten eines [[Objekt (Programmierung)|Objekts]] zur [[Laufzeit (Informatik)|Laufzeit]] reglementiert: Benötigt ein Objekt beispielsweise bei seiner Initialisierung ein anderes Objekt, ist diese Abhängigkeit an einem zentralen Ort hinterlegt – es wird also nicht vom initialisierten Objekt selbst erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Wortbedeutung ==&lt;br /&gt;
Die Bezeichnung Dependency Injection wurde 2004 vom Softwareentwickler [[Martin Fowler]] eingeführt, um den damaligen Begriff [[Inversion of Control]] zu präzisieren: {{&amp;quot;|Sprache=en|Text=Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various [Inversion of Control] advocates we settled on the name Dependency Injection.|Autor=Martin Fowler|Quelle=martinfowler.com}}&amp;lt;ref name=&amp;quot;fowler-2004&amp;quot;&amp;gt;Martin Fowler: [https://martinfowler.com/articles/injection.html Inversion of Control Containers and the Dependency Injection pattern.] 23. Januar 2004 (englisch) abgerufen am 16. Mai 2013.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hintergründe ==&lt;br /&gt;
Mit Dependency Injection ist es möglich –&amp;amp;nbsp;entsprechend dem [[Single-Responsibility-Prinzip]]&amp;amp;nbsp;– die Verantwortlichkeit für den Aufbau des Abhängigkeitsnetzes zwischen den Objekten eines Programmes aus den einzelnen [[Klasse (Objektorientierung)|Klassen]] in eine zentrale [[Komponente (Software)|Komponente]] zu überführen.&lt;br /&gt;
&lt;br /&gt;
In einem herkömmlichen System objektorientierter Programmierung ist dagegen jedes Objekt selbst dafür zuständig, seine Abhängigkeiten –&amp;amp;nbsp;also benötigte Objekte und Ressourcen&amp;amp;nbsp;– zu verwalten. Dafür muss jedes Objekt einige Kenntnisse seiner Umgebung mitbringen, die es zur Erfüllung seiner eigentlichen Aufgabe normalerweise nicht benötigen würde.&lt;br /&gt;
&lt;br /&gt;
Dependency Injection überträgt die Verantwortung für das Erzeugen und die Verknüpfung von Objekten an eine eigenständige Komponente, wie beispielsweise ein extern konfigurierbares [[Framework]]. Dadurch wird der Code des Objektes unabhängiger von seiner Umgebung. Das kann Abhängigkeiten von konkreten Klassen beim [[Compiler|Kompilieren]] vermeiden und erleichtert besonders die Erstellung von [[Unit-Test]]s.&lt;br /&gt;
&lt;br /&gt;
== Vorteile und Nachteile ==&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
&lt;br /&gt;
* Der [[Client]] hat die Flexibilität, konfigurierbar zu sein. Nur das Verhalten des Clients ist festgelegt. Der Client kann auf alles reagieren, was die vom Client erwartete intrinsische Schnittstelle unterstützt.&lt;br /&gt;
* Die Konfigurationsdetails eines Systems können in Konfigurationsdateien ausgelagert werden, sodass das System ohne Neukompilierung neu konfiguriert werden kann. Es können separate Konfigurationen für verschiedene Situationen geschrieben werden, die unterschiedliche Implementierungen von Komponenten erfordern. Dies beinhaltet, ohne darauf beschränkt zu sein, Tests.&lt;br /&gt;
* Weil keine Änderung des Codeverhaltens erforderlich ist, kann sie als [[Refactoring]] auf Legacy-Code angewendet werden. Das Ergebnis sind Clients, die unabhängiger sind und die sich einfacher isoliert testen lassen, indem [[Stub (Programmierung)|Stubs]] oder Scheinobjekte verwendet werden, die andere [[Objekt (Programmierung)|Objekte]] simulieren, die nicht getestet werden. Diese einfache Prüfung ist oft der erste Vorteil, der bei der Verwendung der Abhängigkeitsinjektion festgestellt wird.&lt;br /&gt;
* Der Client kann das gesamte Wissen über eine konkrete Implementierung entfernen, die er verwenden muss. Dies hilft, den Client von den Auswirkungen von Designänderungen und -fehlern zu isolieren. Es fördert die [[Wiederverwendbarkeit]], [[Testbarkeit]] und Wartbarkeit.&lt;br /&gt;
* Reduzierung des [[Boilerplate-Code|Boilerplate-Codes]] in den Anwendungsobjekten, da alle Arbeiten zum Initialisieren oder Einrichten von Abhängigkeiten von einer Anbieterkomponente ausgeführt werden.&lt;br /&gt;
* Gleichzeitige oder unabhängige Entwicklung. Zwei [[Softwareentwickler|Entwickler]] können unabhängig voneinander Klassen entwickeln, die sich gegenseitig verwenden, während sie nur die Schnittstelle kennen müssen, über die die [[Klasse (Objektorientierung)|Klassen]] kommunizieren. [[Plug-in]]s werden oft von Drittanbietern entwickelt, die nicht einmal mit den Entwicklern sprechen, die das Produkt erstellt haben, das die Plug-ins verwendet.&lt;br /&gt;
* Die Kopplung zwischen einer Klasse und ihrer Dependency wird verringert.&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
&lt;br /&gt;
* Es werden Clients erstellt, deren Konfigurationsdetails vom Konstruktionscode bereitgestellt werden müssen. Dies kann lästig sein, wenn offensichtliche Standardeinstellungen verfügbar sind.&lt;br /&gt;
* Das Lesen von Code kann erschwert werden, da sie das Verhalten von der Konstruktion trennt. Dies bedeutet, dass [[Softwareentwickler|Entwickler]] auf weitere Dateien verweisen müssen, um die Leistung eines Systems zu verfolgen.&lt;br /&gt;
* Dependency Injection Frameworks werden mit [[Reflexion (Programmierung)|Reflexion]] oder [[Dynamische Programmiersprache|dynamischen Programmiersprachen]] implementiert. Dies kann die Verwendung der [[Integrierte Entwicklungsumgebung|IDE]]-Automatisierung behindern, z.&amp;amp;nbsp;B. „Referenzen finden“, „Anrufhierarchie anzeigen“ und sichere [[Refactoring]]s. Der Einsatz von Reflexion kann zudem die Leistung des Programms beeinträchtigen.&lt;br /&gt;
* In der Regel ist mehr Entwicklungsaufwand im Voraus erforderlich, da man nicht vorhersagen kann, wann und wo es benötigt wird, sondern anfragen muss, dass es injiziert wird, und dann sicherstellen muss, dass es injiziert wurde.&lt;br /&gt;
* Es ist Aufwand erforderlich, aus [[Klasse (Objektorientierung)|Klassen]] heraus und in die Verknüpfungen zwischen Klassen zu gelangen, die möglicherweise nicht immer wünschenswert oder einfach zu verwalten sind.&lt;br /&gt;
* Die Abhängigkeit von einem Dependency Injection Framework kann gefördert werden.&amp;lt;ref&amp;gt;[https://dzone.com/articles/how-dependency-injection-di-works-in-spring-java-a How Dependency Injection (DI) Works In Spring Java Application Development.] DZone&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
[[Datei:W3sDesign Dependency Injection Design Pattern UML.jpg|mini|Ein Beispiel für ein UML-[[Klassendiagramm]] und [[Sequenzdiagramm]] für das Dependency-Injection-[[Entwurfsmuster]].|alternativtext=|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Im UML-[[Klassendiagramm]] instanziiert die Client-Klasse, für die die [[Objekt (Programmierung)|Objekte]] &amp;#039;&amp;#039;ServiceA&amp;#039;&amp;#039; und &amp;#039;&amp;#039;ServiceB&amp;#039;&amp;#039; erforderlich sind, die [[Klasse (Objektorientierung)|Klassen]] &amp;#039;&amp;#039;ServiceA1&amp;#039;&amp;#039; und &amp;#039;&amp;#039;ServiceB1&amp;#039;&amp;#039; nicht direkt. Stattdessen erstellt eine &amp;#039;&amp;#039;Injector&amp;#039;&amp;#039;-Klasse die Objekte und injiziert sie in den &amp;#039;&amp;#039;Client&amp;#039;&amp;#039;, wodurch der &amp;#039;&amp;#039;Client&amp;#039;&amp;#039; unabhängig davon wird, wie die Objekte erstellt werden.&lt;br /&gt;
&lt;br /&gt;
Das UML-[[Sequenzdiagramm]] zeigt die Laufzeitinteraktionen: Das &amp;#039;&amp;#039;Injector&amp;#039;&amp;#039;-&amp;#039;&amp;#039;Objekt&amp;#039;&amp;#039; erstellt die [[Objekt (Programmierung)|Objekte]] &amp;#039;&amp;#039;ServiceA1&amp;#039;&amp;#039; und &amp;#039;&amp;#039;ServiceB1&amp;#039;&amp;#039;. Danach erstellt der &amp;#039;&amp;#039;Injector&amp;#039;&amp;#039; das &amp;#039;&amp;#039;Client&amp;#039;&amp;#039;-Objekt und injiziert die Objekte &amp;#039;&amp;#039;ServiceA1&amp;#039;&amp;#039; und &amp;#039;&amp;#039;ServiceB1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung ==&lt;br /&gt;
[[Martin Fowler]] beschreibt drei verschiedene Arten zum Setzen benötigter Referenzen, die er mit dem Begriff Dependency Injection verbindet: &amp;#039;&amp;#039;Constructor Injection&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Interface Injection&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Setter Injection&amp;#039;&amp;#039; (Abschnitt &amp;#039;&amp;#039;{{lang|en|Forms of Dependency Injection}}&amp;#039;&amp;#039; in&amp;lt;ref name=&amp;quot;fowler-2004&amp;quot; /&amp;gt;). Alle von ihm geschilderten Verfahrensweisen verwenden dabei Methodenaufrufe, bei denen die zu setzenden Abhängigkeiten nicht [[Rückgabewert]]e, sondern [[Parameter (Informatik)|Parameter]] sind.&lt;br /&gt;
&lt;br /&gt;
=== Constructor Injection ===&lt;br /&gt;
Abhängigkeiten von anderen Klassen werden über Konstruktoren zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Abhaengiges {&lt;br /&gt;
  private Abhaengigkeit abhaengigkeit;&lt;br /&gt;
&lt;br /&gt;
  //Konstruktor&lt;br /&gt;
  public Abhaengiges(final Abhaengigkeit abhaengigkeit) {&lt;br /&gt;
    this.abhaengigkeit = abhaengigkeit;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Injizierer {&lt;br /&gt;
  void methode() {&lt;br /&gt;
    final Abhaengigkeit abhaengigkeit = ... ;&lt;br /&gt;
    final Abhaengiges abhaengiges = new Abhaengiges(abhaengigkeit);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interface Injection ===&lt;br /&gt;
Das Modul der injizierenden Klasse definiert eine [[Schnittstelle (Objektorientierung)|Schnittstelle]], die von abhängigen Klassen implementiert werden muss, um zur Laufzeit die Abhängigkeiten zur Verfügung gestellt zu bekommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
interface Injizierbar {&lt;br /&gt;
  void injiziere(final Abhaengigkeit abhaengigkeit);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Abhaengiges implements Injizierbar {&lt;br /&gt;
  private final Abhaengigkeit abhaengigkeit;&lt;br /&gt;
&lt;br /&gt;
  public void injiziere(final Abhaengigkeit abhaengigkeit) {&lt;br /&gt;
    this.abhaengigkeit = abhaengigkeit;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Injizierer {&lt;br /&gt;
  void methode() {&lt;br /&gt;
    final Abhaengigkeit abhaengigkeit = ... ;&lt;br /&gt;
    final Injizierbar abhaengiges = ... ;&lt;br /&gt;
    abhaengiges.injiziere(abhaengigkeit);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setter Injection ===&lt;br /&gt;
Die abhängige Klasse stellt Methoden zur Verfügung, die dazu verwendet werden, die Abhängigkeiten zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Abhaengiges {&lt;br /&gt;
  private Abhaengigkeit abhaengigkeit;&lt;br /&gt;
&lt;br /&gt;
  public void setAbhaengigkeit(final Abhaengigkeit abhaengigkeit) {&lt;br /&gt;
    this.abhaengigkeit = abhaengigkeit;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Injizierer {&lt;br /&gt;
  void methode() {&lt;br /&gt;
    final Abhaengiges abhaengiges = ... ;&lt;br /&gt;
    final Abhaengigkeit abhaengigkeit = ... ;&lt;br /&gt;
    abhaengiges.setAbhaengigkeit(abhaengigkeit);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weitere Umsetzungsmöglichkeiten ===&lt;br /&gt;
Es ist auch möglich, Dependency Injection auf andere Weisen&amp;lt;ref&amp;gt;Ben Yu: {{Webarchiv |url=http://yan.codehaus.org/Dependency+Injection+Types |text=Dependency Injection Types. |wayback=20060430041354 }} (englisch) abgerufen am 16. Mai 2013.&amp;lt;/ref&amp;gt; umzusetzen, wie sie in manchen Frameworks Verwendung finden. Beispielsweise können Abhängigkeiten nach Möglichkeiten der Programmiersprache durch [[Reflexion (Programmierung)|Reflexion]] oder durch direktes Setzen des Verweises darauf in den Speicher auch ohne Methodenaufrufe gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Es existieren verschiedene [[Framework]]s für diverse [[Programmiersprache]]n und [[Plattform (Computer)|Plattformen]] zur Umsetzung, die fertige Lösungen zur Verfügung stellen. Diese implementieren das Muster mit zum Teil umfassender, weiterführender Funktionalität, wie beispielsweise das Einlesen der Konfiguration aus Dateien und deren Prüfung auf formale Korrektheit. Siehe dazu die [[Liste von Dependency Injection Frameworks]].&lt;br /&gt;
&lt;br /&gt;
Nachteilig kann sich je nach verwendetem DI-Framework auswirken, dass Programmlogik in Konfigurationsdateien ausgelagert werden muss, was die Übersichtlichkeit vermindern und die Wartung erschweren kann: die Entwickler müssen nun zum Verstehen des Codes noch die Konfiguration berücksichtigen, welche sich zudem manchen Hilfsmitteln der Codeanalyse (z.&amp;amp;nbsp;B. [[Integrierte Entwicklungsumgebung|IDE]]-unterstütztes Finden von Abhängigkeiten oder [[Refactoring]]) entzieht.&lt;br /&gt;
&lt;br /&gt;
Dieser Nachteil lässt sich vermeiden, indem die Dependency Injection ähnlich dem [[Entwurfsmuster]] [[Abstrakte Fabrik]] ohne die Verwendung eines Frameworks als Teil des Programms selbst implementiert wird. Diese Art der Umsetzung wird „Do-It-Yourself Dependency Injection“, kurz „DIY-DI“ genannt.&amp;lt;ref name=&amp;quot;parry-2010&amp;quot;&amp;gt;Chad Parry: [https://blacksheep.parry.org/wp-content/uploads/2010/03/DIY-DI.pdf DIY-DI] (PDF; 549&amp;amp;nbsp;kB) 9. März 2010. (englisch) abgerufen am 29. Juni 2014.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Entwurfsmuster}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Lu12r</name></author>
	</entry>
</feed>