Wie hängt die Inversion der Kontrolle mit der Abhängigkeitsinversion zusammen?

11

In vielen Artikeln im gesamten Web scheinen die Begriffe Inversion of Control und Dependency Inversion Principle verwechselt und als Synonyme verwendet zu werden (weitere Verwirrung wird durch die Tools "DI-Container" und "IoC-Container" verstärkt). Ein Wikipedia-Artikel macht einen guten Job und versucht zu erklären, dass IoC nicht dasselbe ist wie DI:

Inversion of Control (IoC) beschreibt ein Design, bei dem benutzerdefinierte Teile eines Computerprogramms den Steuerungsfluss von einer generischen, wiederverwendbaren Bibliothek erhalten

Bei DIP geht es also darum, dass Ihre Module eher von Abstraktionen als von konkreten Implementierungen abhängen.

Bei IoC geht es darum, die Kontrolle über Ihren Programmablauf einem separaten Modul zu übertragen. Mit diesem Modul können Sie die Abhängigkeiten zur Laufzeit auflösen.

Dieser Unterschied scheint fair zu sein, aber ich habe noch nie jemanden gesehen, der andere Anwendungen des IoC-Prinzips als die Auflösung von Abhängigkeiten erwähnt hat. Die Wikipedia-Definition ist ziemlich weit gefasst, und es scheint, als könnten Sie mit einem Modul, das auf der Grundlage seiner Konfiguration und einer internen Logik Aufrufe in Ihren benutzerdefinierten Code ausführen kann, noch viel mehr tun.

Hier sind einige Fragen, die ich noch nicht ganz herausfinden kann:

  • Wie ist die tatsächliche Beziehung zwischen IoC und DIP? Dient IoC immer als Mittel zur Implementierung von DIP?
  • Warum werden Tools zur Abhängigkeitsauflösung sowohl als DI- als auch als IoC-Container bezeichnet? Dies impliziert, dass DI und IoC dasselbe sind.

Hinweis : Diese Frage ist kein Duplikat von Was ist der Unterschied zwischen DI und IoC , da letztere nach der Abhängigkeitsinjektion und nicht nach der Abhängigkeitsinversion fragt.

Andre Borges
quelle
Mögliches Duplikat von Was ist der Unterschied zwischen DI und IoC?
Mücke
@gnat, nein, ist es nicht, bitte sehen Sie meine Bearbeitung
Andre Borges
stimme zu, ich habe diese Entschuldigung verpasst
Mücke
2
IMO, die einfache Antwort lautet "sie sind gleich". IoC ist ein anderer Name für die Abhängigkeitsinversion und beide sind eine Möglichkeit, eine Abhängigkeitsinjektion zu erreichen. Ich sehe "Abhängigkeitsinversion" als einen zutiefst nicht hilfreichen Begriff, da er zu leicht mit Injektion verwechselt werden kann. Es gibt also DI (Injektion) und IoC ist eine Möglichkeit, die Inversion von Abhängigkeiten / Kontrolle durch Injektion zu erreichen.
David Arno

Antworten:

6

Auf Martin Fowlers Website gibt es einen großartigen Artikel, der ein Kapitel speziell über den Unterschied zwischen DIP, DI und IoC enthält . Der Kern davon (wie von dieser Site kopiert) ist

Bei DI geht es darum, wie ein Objekt eine Abhängigkeit erhält. Wenn eine Abhängigkeit extern bereitgestellt wird, verwendet das System DI. Bei IoC geht es darum, wer den Anruf initiiert. Wenn Ihr Code einen Aufruf initiiert, handelt es sich nicht um IoC. Wenn der Container / das System / die Bibliothek den von Ihnen bereitgestellten Code zurückruft, handelt es sich um IoC.

Bei DIP hingegen geht es um die Ebene der Abstraktion in den Nachrichten, die von Ihrem Code an das aufgerufene Objekt gesendet werden. Die Verwendung von DI oder IoC mit DIP ist zwar ausdrucksstärker, leistungsfähiger und domänenausgerichtet, es handelt sich jedoch um unterschiedliche Dimensionen oder Kräfte in einem Gesamtproblem. Bei DI geht es um Verkabelung, bei IoC um Richtung und bei DIP um Form.

JDT
quelle
2
Bei IoC geht es darum, wer den Anruf initiiert - wer leitet den Anruf zu was ein? Wenn ich schreibe, ISomeInterface object = container.Resolve<ISomeInterface>()ist das IoC oder nicht?
Andre Borges
1
Was Sie schreiben, ist eine Implementierung im Service Locater-Muster. Dies ist auch IoC. Nicht IoC ist ISomeInterface object = new MyClass (). Der Aufruf, der gemeint ist, ist also der "Aufruf zur Instanziierung" (oder wer "neu" nennt).
Sjoerd222888
1
"Bei DIP hingegen geht es um die Ebene der Abstraktion in den Nachrichten, die von Ihrem Code an das aufgerufene Objekt gesendet werden." Das klingt für mich nach Unsinn. Wo ist die Umkehrung darin? Er beschreibt die Abstraktion von Abhängigkeiten, nicht die Inversion.
David Arno
@ DavidArno, sagen Sie, wir können der Website von Martin Fowler nicht vertrauen?
Holdenmcgrohen
@holdenmcgrohen, es ist seine Meinung zu Dingen. Nur weil es Martin Fowler ist, macht es keine Tatsache. Er liegt manchmal IMO falsch, zB in Bezug auf das "Anämie-Datenmodell". Andere Male ist er sehr aufschlussreich. Bei dieser Gelegenheit denke ich, dass er auch falsch liegt, da es keinen Sinn ergibt.
David Arno