Ich habe viele Referenzen zu Dependency Injection (DI) und Inversion Of Control (IOC) gesehen, aber ich weiß nicht wirklich, ob es einen Unterschied zwischen ihnen gibt oder nicht.
Ich würde gerne einen oder beide verwenden, aber ich bin ein wenig verwirrt darüber, wie sie sich unterscheiden.
Antworten:
Definitionen
Die Inversion der Steuerung ist ein Entwurfsparadigma mit dem Ziel, das Bewusstsein für konkrete Implementierungen aus dem Anwendungsframeworkcode zu verringern und den domänenspezifischen Komponenten Ihrer Anwendung mehr Kontrolle zu verleihen. In einem herkömmlichen von oben nach unten entworfenen System fließt der logische Fluss des Anwendungs- und Abhängigkeitsbewusstseins von den obersten Komponenten, die zuerst entworfen wurden, zu denjenigen, die zuletzt entworfen wurden. Insofern ist die Umkehrung der Steuerung eine fast wörtliche Umkehrung des Steuerungs- und Abhängigkeitsbewusstseins in einer Anwendung.
Die Abhängigkeitsinjektion ist ein Muster, das zum Erstellen von Instanzen von Klassen verwendet wird, auf die andere Klassen angewiesen sind, ohne beim Kompilieren zu wissen, welche Implementierung verwendet wird, um diese Funktionalität bereitzustellen.
Zusammen arbeiten
Inversion der Steuerung kann Abhängigkeitsinjektion verwenden, da ein Mechanismus erforderlich ist, um die Komponenten zu erstellen, die die spezifische Funktionalität bereitstellen. Andere Optionen sind vorhanden und werden verwendet, z. B. Aktivatoren, Factory-Methoden usw.. Frameworks müssen jedoch nicht auf diese Utility-Klassen verweisen, wenn Framework-Klassen stattdessen die benötigten Abhängigkeiten akzeptieren können.
Beispiele
Ein Beispiel für diese Konzepte ist das Plug-In-Framework in Reflector . Die Plug-Ins haben eine große Kontrolle über das System, obwohl die Anwendung zum Zeitpunkt der Kompilierung nichts über die Plug-Ins wusste. Für jedes dieser Plug-Ins wird eine einzelne Methode aufgerufen: Initialize if memory serve, die die Steuerung an das Plug-In übergibt. Das Framework weiß nicht, was sie tun werden, sondern lässt sie es einfach tun. Die Steuerung wurde von der Hauptanwendung übernommen und der Komponente übertragen, die die spezifische Arbeit ausführt. Umkehrung der Kontrolle.
Das Anwendungsframework ermöglicht den Zugriff auf seine Funktionalität über eine Vielzahl von Dienstanbietern. Ein Plug-In erhält beim Erstellen Verweise auf die Dienstanbieter. Diese Abhängigkeiten ermöglichen es dem Plug-in, eigene Menüelemente hinzuzufügen, die Anzeige von Dateien zu ändern, eigene Informationen in den entsprechenden Bedienfeldern anzuzeigen usw. Da die Abhängigkeiten von der Schnittstelle übergeben werden, können sich die Implementierungen ändern, und die Änderungen werden die nicht beschädigen Code, solange der Vertrag intakt bleibt.
Zu der Zeit wurde eine Factory-Methode verwendet, um die Plug-Ins unter Verwendung von Konfigurationsinformationen, Reflektion und des Activator-Objekts (mindestens in .NET) zu erstellen. Heutzutage gibt es Tools, MEF zum einen, die eine größere Auswahl an Optionen beim Einfügen von Abhängigkeiten ermöglichen, einschließlich der Fähigkeit eines Anwendungsframeworks, eine Liste von Plugins als Abhängigkeit zu akzeptieren.
Zusammenfassung
Obwohl diese Konzepte unabhängig voneinander verwendet werden können und Vorteile bieten, ermöglichen sie zusammen das Schreiben von flexiblerem, wiederverwendbarem und testbarem Code. Als solche sind sie wichtige Konzepte für die Gestaltung objektorientierter Lösungen.
quelle
Guter Artikel zum Verständnis von IOC und DI http://martinfowler.com/articles/injection.html
IOC (Inversion of Control)
IOC bedeutet
Kodierung an Schnittstelle (eine Komponente sollte von der Schnittstelle der anderen Komponente und nicht von impl abhängen) und z
Entfernen des für die Komponentenimplementierung spezifischen Codes, z
IOC kann auf eine der folgenden Arten erreicht werden:
1. DI (Dependency Injection)
2. Service Locator
DI-Container (Dependency Injection)
Laufzeit-Impl-Bestimmung und keine Kompilierungszeit: Bestimmt zur Laufzeit, welche konkrete Implementierung einer Schnittstelle basierend auf einer Konfigurationsdatei verwendet werden soll (daher wissen wir zur Kompilierungszeit nicht, welches Impl verwendet werden soll, und erhöhen so die Konfigurierbarkeit der Anwendung). . Es ist eine Implementierung, bei der die konkrete Beziehung zwischen verschiedenen Modulen zur Laufzeit festgelegt wird.
Instanziierung von impl nach dem Einfügen von Abhängigkeiten: Nach dem Bestimmen des impl instanziiert es diesen impl, indem es zuerst alle seine Abhängigkeiten erstellt (in der Konfigurationsdatei angegeben) und diese Abhängigkeiten dann in diesen impl einfügt
Instanz-Lebenszyklusverwaltung: DI-Container enthalten normalerweise nur Verweise auf Objekte, die für die Verwaltung der Lebenszyklen benötigt werden oder die für zukünftige Injektionen wiederverwendet werden, z. B. Singletons oder Fliehgewichte. Wenn der Container so konfiguriert ist, dass für jeden Aufruf des Containers neue Instanzen einiger Komponenten erstellt werden, vergisst er normalerweise nur das erstellte Objekt. Andernfalls würde es dem Müllsammler schwer fallen, alle diese Objekte zu sammeln, wenn er sie nicht mehr verwendet.
quelle
Ich würde sagen, "Inversion of Control" ist eine Möglichkeit, ein System zu entwerfen, bei dem alle Module als abstrakte Einheiten gedacht sind.
"Abhängigkeitsinjektion" ist eine Implementierung, bei der die konkrete Beziehung zwischen verschiedenen Modulen zur "Laufzeit" festgelegt wird.
quelle
Die Umkehrung der Kontrolle ist ein allgemeines Konzept, in funktionalen Sprachen erfolgt dies normalerweise unter Verwendung von Fortsetzungen. Hiermit können Sie eine API schreiben, bei der beide Seiten "Anrufer" und keine "Angerufenen" sind. In anderen, statischeren Umgebungen verfügen Sie nicht über diese Funktionalität. Daher benötigen Sie diesen Hack, um Hinweise in den Kontrollfluss einzufügen.
quelle