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.
quelle
Antworten:
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
quelle
ISomeInterface object = container.Resolve<ISomeInterface>()
ist das IoC oder nicht?