Was ist Inversion of Control?

stimmen
1k

Inversion of Control (oder IoC) kann sehr verwirrend sein, wenn es zuerst angetroffen wird.

  1. Was ist es?
  2. Welche Probleme hat es zu lösen?
  3. Wann ist es angebracht und wann nicht?
Veröffentlicht am 06/08/2008 um 04:35
quelle vom benutzer
In anderen Sprachen...                            


32 antworten

stimmen
1k

Die Inversion of Control (IoC) und Dependency Injection (DI) Muster sind alle über Abhängigkeiten aus dem Code zu entfernen.

Zum Beispiel, sagen, dass Ihre Anwendung eine Text-Editor-Komponente hat, und Sie wollen die Rechtschreibprüfung zur Verfügung zu stellen. Ihr Standard-Code würde wie folgt aussehen:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Was wir hier getan besteht eine Abhängigkeit zwischen der TextEditorund der SpellChecker. In einem IoC Szenario würden wir so etwas wie dies stattdessen tun:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

Im ersten Codebeispiel sind Instanziieren wir SpellChecker( this.checker = new SpellChecker();), was bedeutet , die TextEditordirekt Klasse auf der abhängig SpellCheckerKlasse.

Im zweiten Codebeispiel schaffen wir eine Abstraktion von den mit SpellCheckerAbhängigkeitsklasse in TextEditorKonstruktor Signatur (nicht in Abhängigkeit der Klasse initialisiert wird ). Dies erlaubt uns , die Abhängigkeit rufen dann an die Texteditor - Klasse übergeben es etwa so:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Jetzt ist der Client die Erstellung TextEditorKlasse hat die Kontrolle darüber , welche SpellCheckerImplementierung zu verwenden , weil wir die Abhängigkeit der Injektion sind TextEditorSignatur.

Dies ist nur ein einfaches Beispiel, gibt es eine gute Serie von Artikeln von Simone Busoli , die es näher erklärt.

Beantwortet am 06/08/2008 um 08:22
quelle vom benutzer

stimmen
485

Inversion of Control ist das, was Sie erhalten, wenn Sie Ihr Programm Rückrufe, zB wie ein GUI-Programm.

Zum Beispiel in einem alten Schule Menü, könnten Sie haben:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

wodurch der Fluss der Benutzerinteraktion.

In einem GUI-Programm, etc. zu jagen, anstatt sagen wir

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

So jetzt die Kontrolle invertiert ... statt der Computer zu akzeptieren Benutzereingaben in einer festen Reihenfolge, steuert der Benutzer die Reihenfolge, in der die Daten eingegeben wird, und wenn die Daten in der Datenbank gespeichert.

Im Grunde genommen alles mit einer Ereignisschleife, Rückrufe, oder führt Trigger fällt in diese Kategorie.

Beantwortet am 06/08/2008 um 06:42
quelle vom benutzer

stimmen
356

Was ist Inversion of Control?

Wenn Sie diese einfachen zwei Schritte ausgeführt haben, haben Sie Inversion of Control getan:

  1. Separate was -bis habende Teil aus , wenn -bis habende Teil.
  2. Stellen Sie sicher , dass , wenn ein Teil weiß so wenig wie möglich über welchen Teil; und umgekehrt.

Es gibt verschiedene Techniken möglich, jeden dieser Schritte basiert auf der Technologie / Sprache, die Sie für Ihre Implementierung verwenden.

-

Die Umkehrung Teil der Inversion of Control (IoC) ist die verwirrende Sache; weil Inversion ist die relative Grösse . Der beste Weg , IoC zu verstehen ist , über dieses Wort zu vergessen!

-

Beispiele

  • Handhabung des Events. Handlers Ereignis (was zu tun Teil) - Die Anhebung der Ereignisse (when-to-do-Teil)
  • Schnittstellen. Component-Client (when-to-do-Teil) - Component Interface-Implementierung (was zu tun Teil)
  • xUnit fixure. Auf- und Abbau (was tun Teil) - xUnit Frameworks ruft Setup am Anfang und TearDown am Ende (wenn-to-do-Teil)
  • Template-Methode Design-Muster. Template-Methode, wenn tun Teil - primitive Unterklasse Implementierung, was zu tun Teil
  • DLL Container Methoden in COM. DllMain, DllCanUnload, usw. (was tun Teil) - COM / O (when-to-do-Teil)
Beantwortet am 22/07/2010 um 18:34
quelle vom benutzer

stimmen
81

Inversion der Kontrollen ist über Bedenken zu trennen.

Ohne IoC : Sie haben einen Laptop - Computer und Sie versehentlich den Bildschirm brechen. Und verflixt, finden Sie das gleiche Modell Laptop - Bildschirm nirgendwo auf dem Markt ist. Sie sind also fest.

Mit IoC : Sie haben einen Desktop - Computer und Sie versehentlich den Bildschirm brechen. Sie finden Sie können einfach aus dem Markt fast jeden Desktop - Monitor greifen, und es funktioniert gut mit Ihrem Desktop.

Ihr Desktop erfolgreich implementiert IoC in diesem Fall. Er akzeptiert eine Vielzahl Art von Monitoren, während der Laptop nicht der Fall, muss es eine bestimmte Bildschirm behoben.

Beantwortet am 25/09/2013 um 15:24
quelle vom benutzer

stimmen
77

Inversion of Control (oder IoC), geht es um die Freiheit bekommen (Sie heiraten, verloren Sie Freiheit und Sie werden kontrolliert. Sie scheiden, Sie haben gerade umgesetzt Inversion of Control. Das ist , was wir genannt, „entkoppelt“. Gute Computersystem schreckt einige sehr enge Beziehung.) mehr Flexibilität (die Küche in Ihrem Büro dient nur sauberes Leitungswasser, dass die einzige Wahl ist , wenn Sie trinken möchten. Ihr Chef Inversion of Control implementiert eine neue Kaffeemaschine durch die Einrichtung. Jetzt erhalten Sie die Flexibilität von entweder Leitungswasser oder Kaffee wählen.) und weniger Abhängigkeit (Ihr Partner hat einen Job, müssen Sie nicht einen Job haben, Sie hängen finanziell von Ihrem Partner, so dass Sie gesteuert werden. Sie einen Job finden, haben Sie Inversion of Control implementiert. Gute Computersystem fördert in Abhängigkeit.)

Wenn Sie einen Desktop-Computer verwenden, haben Sie geschuftet (oder sagen, gesteuert). Sie haben vor einem Bildschirm sitzen und schauen Sie es. Verwenden der Tastatur mit der Maus eingeben und mit navigieren. Und eine schlecht geschriebene Software können Sie noch mehr Slave. Wenn Sie Ihren Desktop mit einem Laptop ersetzen, dann etwas Sie die Kontrolle invertiert. Sie können es leicht nehmen und sich bewegen. So, jetzt können Sie steuern, wo Sie mit Ihrem Computer sind, statt für Ihren Computer zu steuern.

Durch Inversion of Control Implementierung erhalten ein Software / Objekt Verbraucher mehr Kontrollen / Optionen über die Software / Objekte, statt gesteuert wird oder weniger Optionen haben.

Mit den oben genannten Ideen im Kopf. Wir vermissen noch einen wichtigen Teil der IoC. In dem Szenario von IoC ist die Software / Objekt Verbraucher ein hoch entwickeltes Framework. Das bedeutet, dass der Code, den Sie nicht selbst genannt wird erstellt. Lassen Sie uns jetzt erklären, warum diese Art und Weise für eine Web-Anwendung besser funktioniert.

Angenommen , Ihr Code eine Gruppe von Arbeitern ist. Sie brauchen ein Auto zu bauen. Diese Arbeiter brauchen einen Ort und Werkzeuge (eine Software - Framework) , um das Auto zu bauen. Ein traditioneller Software - Framework wird mit vielen Tools wie eine Garage sein. So müssen die Arbeiter selbst , einen Plan zu machen und die Werkzeuge verwenden , um das Auto zu bauen. Ein Auto zu bauen ist kein einfaches Geschäft, wird es wirklich schwer für die Arbeiter richtig zu planen und zu kooperieren. EIN moderneSoftware-Framework wird mit allen Einrichtungen und Managern an Ort und Stelle wie eine moderne Autofabrik sein. Die Arbeiter müssen keinen Plan machen, die Manager (Teil des Rahmens sind sie die klügstenen Menschen und machten den anspruchsvollsten Plan) werden dazu beitragen, koordinieren, damit die Arbeiter wissen, wann ihre Arbeit zu tun (Framework ruft Code). Die Arbeiter müssen nur flexibel genug sein, irgendwelche Werkzeuge zu verwenden, die Manager zu ihnen geben (unter Verwendung von Dependency Injection).

Obwohl die Arbeiter geben die Kontrolle über das Projekt auf der obersten Ebene an die Manager die Verwaltung (der Rahmen). Aber es ist gut, einige Profis zu haben, helfen. Das ist das Konzept von IoC wirklich kommen.

Moderne Web-Anwendungen mit einer MVC-Architektur hängt von den Rahmenbedingungen URL Routing zu tun und Controller in Platz für den Rahmen setzen zu nennen.

Dependency Injection und Inversion of Control beziehen. Dependency Injection ist auf der Mikroebene und Inversion of Control ist auf der Makro - Ebene. Sie haben jeden Bissen zu essen (implementieren DI), um eine Mahlzeit zu beenden (implementieren IoC).

Beantwortet am 04/03/2013 um 20:33
quelle vom benutzer

stimmen
72

Vor Inversion of Control verwenden, sollten Sie auch der Tatsache bewusst sein, dass es seine Vor- und Nachteile hat, und Sie sollten wissen, warum Sie es verwenden, wenn Sie dies tun.

Pro:

  • Ihr Code wird entkoppelt, so dass Sie leicht Implementierungen einer Schnittstelle mit alternativen Implementierungen austauschen können
  • Es ist ein starker Motivator für die Codierung gegen Schnittstellen statt Implementierungen
  • Es ist sehr einfach Unit-Tests für den Code zu schreiben, weil es auf nichts anderes als die Objekte hängt es in seinem Konstruktor / Setter akzeptiert und Sie können sie mit den richtigen Objekten in Isolation leicht initialisieren.

Nachteile:

  • IoC kehrt nicht nur der Steuerfluss in Ihrem Programm, es trübt es auch beträchtlich. Das heißt, Sie können nicht mehr nur lesen den Code und springen von einem Ort zum anderen, weil die Verbindungen, die normalerweise im Code wäre nicht mehr im Code sind. Stattdessen ist es in XML-Konfigurationsdateien oder Anmerkungen und in dem Code Ihrer IoC-Container, die diese Metadaten interpretiert.
  • Es entsteht eine neue Klasse von Fehlern, wo Sie Ihren XML-Konfigurations oder Ihre Anmerkungen falsch und Sie können eine Menge Zeit damit verbringen, herauszufinden, warum Ihr IoC-Container einen NULL-Verweis in ein Ihre Objekte unter bestimmten Bedingungen injiziert.

Ich persönlich sehe die Stärken von IoC und Ich mag sie wirklich, aber ich neige dazu, IoC zu vermeiden, wann immer möglich, weil es Ihre Software in eine Sammlung von Klassen verwandelt, die nicht mehr ein „echtes“ Programm dar, sondern nur etwas, das zusammengesetzt werden muss durch XML-Konfiguration oder eine Anmerkung Metadaten und fallen würden (und falls) auseinander, ohne sie.

Beantwortet am 12/02/2010 um 15:31
quelle vom benutzer

stimmen
55
  1. Wikipedia Artikel . Für mich Inversion of Control wird Ihre sequentiell geschriebenen Code drehen und in eine Delegation Struktur drehen. Anstelle des Programms explizit steuern alles, Ihr Programm setzt eine Klasse oder Bibliothek mit bestimmten Funktionen bis zu aufgerufen werden , wenn bestimmte Dinge passieren.

  2. Es löst Code-Duplizierung. Zum Beispiel in den alten Tagen würden Sie manuell Ihre eigenen Ereignisschleife, die Abfrage des Systembibliotheken für neue Ereignisse schreiben. Heute sagen die meisten modernen APIs Sie einfach die Systembibliotheken, welche Ereignisse Sie interessiert sind, und es wird Sie wissen lassen, wenn sie passieren.

  3. Inversion of Control ist ein praktischer Weg, Code-Duplizierung zu reduzieren, und wenn Sie sich finden eine ganze Methode zu kopieren und nur ein kleines Stück des Codes ändern, können Sie halten es mit einer Inversion der Kontrolle Angriff zu nehmen. Inversion of Control leicht gemacht in vielen Sprachen durch das Konzept der Delegierten, Schnittstellen oder sogar roh Funktionszeiger.

    Es ist nicht angebracht, in allen Fällen zu verwenden, da der Ablauf eines Programms kann schwieriger sein, zu folgen, wenn auf diese Weise geschrieben. Es ist eine nützliche Methode, Methoden zu entwickeln, wenn eine Bibliothek zu schreiben, die wiederverwendet werden, aber es sollte sparsam im Kern des eigenen Programms verwendet werden, es sei denn, es ist wirklich ein Code-Duplizierung Problem löst.

Beantwortet am 06/08/2008 um 05:33
quelle vom benutzer

stimmen
38

Aber ich denke, Sie mit ihm sehr vorsichtig sein. Wenn Sie diese Muster überstrapazieren wird, werden Sie sehr komplizierte Konstruktion machen und sogar noch komplizierter Code.

Wie in diesem Beispiel mit Texteditor: Wenn Sie nur eine Rechtschreibprüfung haben vielleicht ist es nicht wirklich notwendig IoC zu benutzen? Es sei denn, müssen Sie Unit-Tests oder etwas schreiben ...

Wie dem auch sei: angemessen sein. Entwurfsmuster sind gute Praktiken aber nicht Bibel gepredigt werden. Verwenden Sie es nicht überall kleben.

Beantwortet am 06/08/2008 um 23:08
quelle vom benutzer

stimmen
34

Angenommen, Sie ein Objekt sind. Und Sie gehen in ein Restaurant:

Ohne IoC : Sie fragen nach „apple“, und Sie werden immer Apfel serviert , wenn Sie mehr verlangen.

Mit IoC : können Sie fragen nach „Frucht“. Sie können verschiedene Früchte jedes Mal bekommen Sie serviert bekommen. zum Beispiel Apfel, Orange, oder Wassermelone.

Also, natürlich ist IoC bevorzugt, wenn Sie die Sorten mögen.

Beantwortet am 25/09/2013 um 15:00
quelle vom benutzer

stimmen
34

IoC / DI mir drängt aus Abhängigkeiten zu den Aufruf Objekte. Super einfach.

Die Nicht-techy Antwort ist in der Lage, direkt einen Motor in einem Auto zu tauschen, bevor Sie es einschalten. Wenn alles richtig (die Schnittstelle) bis Haken, Sie sind gut.

Beantwortet am 19/09/2008 um 03:54
quelle vom benutzer

stimmen
23
  1. Inversion der Kontrolle ist ein Muster, verwendet für die Komponenten und Schichten im System zu entkoppeln. Das Muster wird implementiert durch Abhängigkeiten in eine Komponente Injizieren, wenn es aufgebaut ist. Diese Abhängigkeiten sind üblicherweise als Schnittstellen für weitere Entkoppelung vorgesehen und Testbarkeit zu unterstützen. IoC / DI-Container wie Schloss Windsor, Unity sind Werkzeuge (Bibliotheken), die für die Bereitstellung von IoC verwendet werden kann. Diese Tools bieten erweiterte Funktionen weit über einfache Abhängigkeitsmanagement, einschließlich Lebensdauer, AOP / Interception, Politik usw.

  2. ein. Lindert eine Komponente aus verantwortlich für seine Abhängigkeiten zu verwalten.
    b. Bietet die Möglichkeit , die Abhängigkeit Implementierungen in verschiedenen Umgebungen zu tauschen.
    c. Ermöglicht wird eine Komponente durch spöttische von Abhängigkeiten getestet.
    d. Stellt einen Mechanismus für Ressourcen der gesamten Anwendung zu teilen.

  3. ein. Kritisch , wenn testgetriebene Entwicklung zu tun. Ohne IoC kann es schwierig sein , zu prüfen, da die Komponenten unter Test werden an den Rest des Systems hoch gekoppelt.
    b. Kritisch bei der Entwicklung von modularen Systemen. Ein modulares System ist ein System , dessen Komponenten können ohne Neukompilierung ersetzt werden.
    c. Kritisch , wenn es viele Querschnittsthemen , die müssen angegangen, partilarly in einer Unternehmensanwendung.

Beantwortet am 19/09/2008 um 03:27
quelle vom benutzer

stimmen
17

Ich werde mein einfaches Verständnis dieser beiden Begriffe aufschreiben:

For quick understanding just read examples*

Dependency Injection (DI):
Abhängigkeits Injektion im Allgemeinen bedeutet ein Objekt übergab , auf dem Verfahren, als ein Parameter auf ein Verfahren richtet, anstatt das Verfahren das abhängige Objekt erstellen .
Was es bedeutet , in der Praxis ist , dass das Verfahren nicht direkt auf eine bestimmte Implementierung nicht abhängt; jede Implementierung , die die Anforderungen erfüllt , kann als Parameter übergeben werden.

Mit Objekten dieser thier Abhängigkeiten sagen. Und der Frühling zur Verfügung stellt.
Dies führt zu einer Anwendungsentwicklung lose gekoppelt.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversion of Control (IOC) Behälter:
Dies ist gemeinsames Merkmal von Gerüsten, IOC verwaltet Java - Objekte
- von der Instanziierung zur Zerstörung durch seine BeanFactory.
-java Komponenten, die von dem IoC - Container instanziert werden , Bohnen genannt, und die IoC - Container verwalten einen Umfang des Beans, Lebensereignisse und alle AOP - Funktionen , für die sie konfiguriert und codiert wurde.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Durch Inversion of Control Implementierung erhalten ein Software / Objekt Verbraucher mehr Kontrollen / Optionen über die Software / Objekte, statt gesteuert wird oder weniger Optionen haben.

Inversion of Control als Design-Richtlinie dient folgenden Zwecken:

Es gibt eine Entkopplung der Ausführung einer bestimmten Aufgabe von der Implementierung.
Jedes Modul kann auf das konzentrieren , was es konzipiert ist.
Module machen keine Annahmen über das, was andere Systeme tun , sondern verlassen sich auf ihre Verträge.
Austausch von Modulen hat keine Nebenwirkungen auf andere Module
ich die Dinge hier abstrakt halten, können Sie folgende Links zum Detail Verständnis des Themas besuchen.
Ein gutes Buch mit Beispiel

Ausführliche Erklärung

Beantwortet am 10/11/2014 um 08:43
quelle vom benutzer

stimmen
15

Zum Beispiel Aufgabe # 1 ist Objekt zu erstellen. Ohne IOC Konzept, Aufgabe # 1 soll durch Programmer.But mit IOC-Konzept Aufgabe # 1 würde getan werden durch Behälter getan werden.

Kurz Steuerung wird von Programmer Behälter umgedreht. So wird es als Inversion of Control bezeichnet.

Ich fand ein gutes Beispiel hier .

Beantwortet am 27/01/2010 um 13:15
quelle vom benutzer

stimmen
14

Die Beantwortung nur den ersten Teil. Was ist es?

Inversion of Control (IOC) bedeutet Instanzen von Abhängigkeiten zu schaffen ersten und letztere Instanz einer Klasse (optional sie durch Injizieren Konstruktor) anstelle eine Instanz der Klasse ersten erstellen und dann die Klasseninstanz Instanzen von Abhängigkeiten erzeugen. So Umkehrung der Steuer kehrt die Ablaufsteuerung des Programms. Anstelle von dem Angerufenen die Steuerung der Ablaufsteuerung (während Abhängigkeiten zu schaffen), der steuert Anrufer den Ablauf der Steuerung des Programms .

Beantwortet am 11/01/2016 um 00:49
quelle vom benutzer

stimmen
14

Es scheint, dass die meisten verwirrende Sache über „IoC“ das Akronym und den Namen für die sie steht, ist, dass es zu glamourös eines Namens - fast ein Rausch Namen.

Brauchen wir wirklich einen Namen, mit dem die Differenz zwischen Verfahrens- und ereignisgesteuerte Programmierung zu beschreiben? OK, wenn wir müssen, aber brauchen wir ein brandneuen „größer als das Leben“ pick Namen, die mehr verwirrt als sie löst?

Beantwortet am 19/01/2011 um 04:50
quelle vom benutzer

stimmen
13

Lassen Sie sagen, dass wir einige Treffen in einigen Hotels machen.

Viele Menschen, viele Karaffen Wasser, viele Plastikbecher.

Wenn jemand trinken wollen, sie Tasse, trinken füllen und Becher auf den Boden werfen.

Nach Stunde oder etwas, das wir haben einen Boden aus Plastikbecher und Wasser bedeckt.

Lassen Sie Invertzucker Kontrolle.

Die gleiche Sitzung an der gleichen Stelle, aber statt Plastikbecher wir einen Kellner mit einem Glasbecher (Singleton) haben

und sie alle Zeit bietet den Gästen zu trinken.

Wenn jemand trinken wollen, bekommen sie von Kellner Glas, trinken und senden es an Kellner zurück.

Abgesehen von der Frage der Hygiene, letzten Form von Trinkprozesskontrolle ist viel effektiver und wirtschaftlicher.

Und das ist genau das, was der Frühling (ein weiterer IoC-Container, zum Beispiel: Guice) der Fall ist. Statt let zu Anwendung erstellen, was es neues Schlüsselwort müssen mit (unter Plastikbecher), Frühling IoC-Container alle Zeitangebot Anwendung der gleichen Instanz (Singleton) der benötigten Objekt (Glas Wasser).

Denken Sie an sich selbst als Veranstalter der Versammlung. Sie müssen den Weg zum Hotel Verwaltung Nachricht, die

Treffen Mitglieder Glas Wasser benötigen, aber nicht Stück Kuchen.

Beispiel:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Nützliche Links:-

Beantwortet am 26/09/2012 um 18:54
quelle vom benutzer

stimmen
13

Ich stimme mit NilObject , aber ich möchte diese hinzufügen:

wenn Sie sich eine ganze Methode finden Kopieren und nur ein kleines Stück des Codes ändern, können Sie halten es mit einer Inversion der Kontrolle der Bekämpfung

Wenn Sie sich selbst Kopieren und Einfügen von Code um zu finden, sind Sie fast immer tun etwas falsch. Kodifiziert als Konstruktionsprinzip Einmal und nur einmal .

Beantwortet am 06/08/2008 um 06:20
quelle vom benutzer

stimmen
10

IoC ist über die Beziehung zwischen Ihrem Code und Code von Drittanbietern Umkehren (Bibliothek / Framework):

  • Im normalen s / w Entwicklung, schreiben Sie die main () Methode und rufen „Bibliothek“ Methoden. Sie sind in der Steuerung :)
  • In IoC der „Rahmen“ steuert main () und ruft Ihre Methoden. Der Rahmen ist in Kontrolle :(

DI (Dependency Injection) etwa wie die Steuerströme in der Anwendung. Traditionelle Desktop-Anwendung hatte die Kontrolle Flow aus Ihrer Anwendung (Methode main ()) zu anderen Bibliothek Methodenaufrufe, aber mit DI Steuerfluss umgekehrt wird, das ist Framework kümmert sich die App zu starten, initialisiert es und Ihre Methoden aufrufen, wann immer erforderlich.

Am Ende gewinnt sie immer :)

Beantwortet am 19/09/2014 um 19:25
quelle vom benutzer

stimmen
7

Inversion of Control ist ein allgemeiner Grundsatz, während Dependency Injection realisiert dieses Prinzip als Designmuster für Objektgraph-Konstruktion (dh Konfiguration steuert, wie die Objekte sich verweisen, anstatt das Objekt selbst steuern, wie den Verweis auf ein anderes Objekt zu erhalten).

Mit Blick auf Inversion of Control als Design-Muster, müssen wir schauen, was wir zu invertieren. Dependency Injection kehrt die Kontrolle über eine grafische Darstellung der Objekte zu konstruieren. Wenn in juristischem Begriff gesagt, Umkehrung der Steuer impliziert in Ablaufsteuerung im Programm ändern. Z.B. In der traditionellen Standalone-Anwendung, haben wir Hauptmethode, von wo aus der Kontrolle an anderen Drittanbieter-Bibliotheken übergeben wird (im Fall haben wir Dritte Bibliothek Funktion verwendet wird), sondern durch Umkehrung der Steuerkontrolle wird von Dritten Bibliothekscode in unseren Code übertragen , wie wir den Service von dritter Bibliothek einnehmen. Aber es gibt noch andere Aspekte, die innerhalb eines Programms invertiert werden müssen - zB Aufruf von Methoden und Threads den Code auszuführen.

Für diejenigen , die mehr Tiefe auf Inversion of Control ein Papier veröffentlicht wurde als Designmuster ein vollständigeres Bild der Inversion of Control umreißt (OfficeFloor: Büro Mustern zu verbessern Software - Design http://doi.acm.org/10.1145/ 2739011.2739013 mit einer kostenlosen Kopie zum Download von http://www.officefloor.net/mission.html )

Was ist identifiziert ist die folgende Beziehung:

Inversion of Control (für Methoden) = Abhängigkeit (Zustand) Injection + Continuation Injection + Gewinde Injection

Beantwortet am 29/10/2015 um 04:27
quelle vom benutzer

stimmen
7

Programmierung Sprechen

IoC in einfachen Bedingungen: Es ist die Verwendung von Schnittstellen als eine Möglichkeit, bestimmt etwas (wie ein Feld oder einen Parameter) als Platzhalter, die von einigen Klassen verwendet werden kann. Es ermöglicht die Wiederverwendbarkeit des Codes.

Zum Beispiel lassen Sie uns sagen , dass wir zwei Klassen: Hund und Katze . Beide haben die gleichen Qualitäten / heißt es : Alter, Größe, Gewicht. Anstatt also eine Klasse von Dienst namens Erstellen DogService und CatService , kann ich eine einzelne genannt erstellen AnimalService , die nur Hund und Katze verwenden können , wenn sie die Schnittstelle verwenden IAnimal .

Allerdings pragmatisch gesprochen, hat es einige rückwärts.

a) Die meisten Entwickler nicht wissen , wie es zu benutzen . Zum Beispiel kann ich eine Klasse namens erstellen Kunden und ich kann automatisch erstellen (mit den Tools der IDE) eine Schnittstelle namens ICustomer . So ist es nicht selten , dass ein Ordner mit Klassen und Schnittstellen gefüllt zu finden, unabhängig davon , ob die Schnittstellen wiederverwendet werden oder nicht. Es ist aufgebläht genannt. Einige Leute könnten argumentieren , dass „in der Zukunft sein können , wir könnten es verwenden“. : - |

b) Es hat einige Begrenzungen. Zum Beispiel, lassen Sie uns über den Fall sprechen Hund und Katze und ich möchte für Hunde einen neuen Dienst (Funktionalität) nur hinzuzufügen. Lassen Sie uns sagen , dass ich die Anzahl der Tage berechnen möchten , die ich brauche einen Hund (Zug trainDays()), für Katzen es nutzlos ist, Katzen nicht trainiert werden kann (ich scherze).

b.1) Wenn ich hinzufügen , trainDays()auf den Service AnimalService dann funktioniert es auch mit Katzen und es ist überhaupt nicht gültig.

b.2) Ich kann eine Bedingung in hinzufügen , trainDays()wo sie auswertet , welche Klasse verwendet wird. Aber es wird brechen vollständig das IOK.

b.3) Ich kann eine neue Klasse von Service schaffen genannt DogService nur für die neue Funktionalität. Aber, es wird die Wartbarkeit des Codes zu erhöhen , weil wir zwei Serviceklassen haben (mit ähnlicher Funktionalität) für Hund und es ist schlecht.

Beantwortet am 19/04/2015 um 12:07
quelle vom benutzer

stimmen
7

Eine sehr einfache schriftliche Erklärung finden Sie hier

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

es sagt

„Jede nicht-triviale Anwendung besteht aus zwei oder mehr Klassen gemacht, die miteinander zusammenarbeiten, um eine Business-Logik durchzuführen. Traditionell jedes Objekt ist verantwortlich für seine eigene Verweise auf die Objekte zu erhalten mit (seiner Abhängigkeiten) zusammenarbeitet. Wenn DI Anwendung, die Objekte werden die Abhängigkeiten zum Zeitpunkt der Erstellung durch eine externe Einheit gegeben, das jedes Objekt in dem System koordiniert. mit anderen Worten, Abhängigkeiten in Objekte injiziert werden.“

Beantwortet am 22/02/2013 um 15:13
quelle vom benutzer

stimmen
6

Ich mag diese Erklärung: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

Es startet einfach und zeigt auch Code-Beispiele.

Geben Sie hier image description

Der Verbraucher, X, muss die verbrauchte Klasse, Y, um etwas zu erreichen. Das ist alles gut und natürlich, aber nicht X wirklich müssen wissen, dass es verwendet Y?

Genügt es nicht, dass X weiß, dass es etwas nutzt, die das Verhalten hat, die Methoden, Eigenschaften usw., von Y ohne zu wissen, wer das Verhalten tatsächlich implementiert?

Durch eine abstrakte Definition des Verhaltens Extrahieren von X in Y verwendet, wie ich unten dargestellt, und lassen die Verbraucher X eine Instanz, dass anstelle von Y verwenden sie auch weiterhin tun, was es tut, ohne die Einzelheiten über Y. kennen

Geben Sie hier image description

In der Abbildung oben Y implementiert I und X verwendet eine Instanz von I. Während es durchaus möglich ist, dass X-Y immer noch verwendet, was interessant ist, dass X nicht kennt. Er weiß nur, dass es etwas verwendet, das I. implementiert

Lesen Sie Artikel für weitere Informationen und eine Beschreibung der Vorteile wie:

  • X ist nicht abhängig von Y mehr
  • Flexibler, kann die Umsetzung in der Laufzeit entschieden werden
  • Isolierung von Codeeinheit, einfacher Test

...

Beantwortet am 16/02/2017 um 02:03
quelle vom benutzer

stimmen
4

Inversion of Control ist über die Kontrolle von der Bibliothek an den Client übertragen. Es macht mehr Sinn, wenn wir über einen Kunden sprechen, die (pass) einen Funktionswert (Lambda-Ausdruck) in eine Funktion höherer Ordnung (Bibliotheksfunktion) injiziert, die (Änderungen) das Verhalten der Bibliotheksfunktion steuern. Ein Client oder Rahmen, die Bibliothek Abhängigkeiten injiziert (das Verhalten tragen) in Bibliotheken auch IoC werden berücksichtigt

Beantwortet am 24/12/2017 um 18:34
quelle vom benutzer

stimmen
4

Ich fand ein sehr klares Beispiel hier , die erklärt , wie die ‚Steuerung invertiert‘.

Klassische Code (ohne Dependency Injection)

Hier ist, wie ein Code nicht DI verwendet wird grob arbeiten:

  • Anwendung benötigt Foo (zB Controller), so:
  • Anwendung erstellt Foo
  • Anwendung ruft Foo
    • Foo braucht Bar (zB Service), so:
    • Foo schafft Bar
    • Foo Anrufe Bar
      • Bar braucht Bim (ein Service, ein Repository, ...), so:
      • Bar schafft Bim
      • Bar etwas tut

Mit Dependency Injection

Hier ist, wie ein Code DI verwendet wird grob arbeiten:

  • Anwendung muss Foo, die Bar braucht, die Bim benötigt, so:
  • Anwendung erstellt Bim
  • Anwendung erstellt Bar und gibt es Bim
  • Anwendung erstellt Foo und gibt es Bar
  • Anwendung ruft Foo
    • Foo Anrufe Bar
      • Bar etwas tut

Die Steuerung der Abhängigkeiten invertiert von einem auf die einer Berufung berufen.

Welche Probleme hat es zu lösen?

Dependency Injection macht es einfach, mit der unterschiedlichen Umsetzung der injizierten Klassen zu tauschen. Während Unit-Tests können Sie eine Dummy-Implementierung injizieren, die die Prüfung viel einfacher macht.

Ex: Angenommen, Ihre Anwendung speichert die Benutzer hochgeladene Datei in Google Drive, mit DI Ihr Controller-Code wie folgt aussehen:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Wenn Ihre Anforderungen sagen ändern, statt Google Drive Sie werden gebeten, die Dropbox zu verwenden. Sie brauchen nur eine Dropbox-Implementierung für die StorageServiceInterface zu schreiben. Sie haben keine Änderungen in der Steuerung machen, solange Dropbox Umsetzung der StorageServiceInterface haftet.

Beim Testen Sie die Mock für die StorageServiceInterface mit der Dummy-Implementierung zu schaffen, in der alle Methoden null zurück (oder einem vorgegebenen Wert, wie pro Ihrer Testanforderung).

Stattdessen , wenn Sie die Controller - Klasse hatte das Speicherobjekt mit dem konstruieren newSchlüsselwort wie folgt aus :

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Wenn Sie mit der Dropbox Implementierung ändern möchten , müssen Sie alle Zeilen ersetzen , wo newGoogleDriveService Objekt aufgebaut ist , und die DropboxService verwenden. Neben bei der Prüfung der SomeController Klasse erwartet der Konstruktor immer die GoogleDriveService Klasse und die tatsächlichen Methoden dieser Klasse ausgelöst werden.

Wann ist es angebracht und wann nicht? Meiner Meinung nach verwenden Sie DI , wenn Sie denken , es sind (oder es kann) alternative Implementierungen einer Klasse.

Beantwortet am 04/11/2017 um 13:27
quelle vom benutzer

stimmen
4

Ich verstehe, dass die Antwort bereits hier gegeben worden. Aber ich denke immer noch, müssen einige Grundlagen über die Umkehrung der Steuer diskutiert werden hier in der Länge für zukünftige Leser.

Inversion of Control (IoC) wurde auf einem ganz einfachen Prinzip gebaut genannt Hollywood - Prinzip . Und er sagt , dass,

Rufen Sie uns nicht, rufen wir Sie

Was es bedeutet, ist, dass nicht auf die Hollywood gehen Ihren Traum eher zu erfüllen, wenn Sie wert sind, dann wird Hollywood finden Sie und machen Sie Ihren Traum wahr wird. Ziemlich viel invertiert, nicht wahr?

Nun, wenn wir über das Prinzip des IoC diskutieren, nutzen wir über das Hollywood zu vergessen. Für IoC, hat es drei Elemente sein, ein Hollywood, Sie und eine Aufgabe, wie Ihr Traum zu erfüllen.

In unserer Programmierung Welt, Hollywood stellen ein generisches Framework (durch Sie oder jemand anderes geschrieben werden können), Sie stellen den Benutzercode , den Sie geschrieben und die Aufgabe repräsentieren das , was Sie mit Ihrem Code erreichen möchten. Jetzt gehen Sie nicht immer Ihre Aufgabe ausgelöst wird , um sich selbst, nicht in IoC! Vielmehr haben Sie alles in so ausgelegt , dass Ihr Rahmen Ihrer Aufgabe für Sie auslösen. So haben Sie einen wieder verwendbaren Rahmen gebaut , die jemand ein Held oder ein anderer ein Bösewicht machen. Aber dieser Rahmen ist immer verantwortlich, es weiß , wann jemand holen und dass jemand weiß , was es sein will.

Ein richtiges Beispiel wäre hier gegeben werden. Nehmen wir an, Sie wollen eine Web-Anwendung entwickeln. So erstellen Sie einen Rahmen, der alle gängigen Dinge eine Web-Anwendung HTTP-Anforderung wie Handhabung behandelt behandeln soll, Anwendungsmenü erstellen, Seiten dienen, die Verwaltung von Cookies, auslösende Ereignisse usw.

Und dann lassen Sie einige Haken in Ihrem Rahmen, in dem Sie weitere Codes setzen können benutzerdefinierte Menüs, Seiten, Cookies oder Protokollierung einige Benutzerereignisse usw. Auf jedem Browser-Anfrage, Ihr Rahmen wird generieren laufen und führt Ihre benutzerdefinierten Codes verhakt, wenn dann dienen sie zurück an den Browser.

So ist die Idee ziemlich einfach. Anstatt eine Benutzeranwendung zu schaffen, die alles steuern, zuerst erstellen Sie einen wieder verwendbaren Rahmen, der alles steuert dann Ihre individuellen Codes schreiben und an den Rahmen einhaken diejenigen in der Zeit auszuführen.

Laravel und EJB sind Beispiele für einen solchen Rahmen.

Referenz:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

Beantwortet am 01/10/2017 um 11:24
quelle vom benutzer

stimmen
4

IoC wird auch als Dependency Injection (DI) bekannt. Es ist ein Prozess, bei den Objekten, die Abhängigkeiten definieren, das heißt, die anderen Objekte mit denen sie arbeiten, nur durch Konstruktorargumente, Argumente an eine Fabrikmethode, oder Eigenschaften, die auf der Objektinstanz eingestellt werden, nachdem es aufgebaut ist, oder aus einer Fabrik-Methode zurück . Der Behälter spritzt dann diese Abhängigkeiten, wenn es die Bohne erzeugt. Dieser Prozeß ist im wesentlichen die inverse, daher der Name Inversion of Control (IOC), der Bohne selbst die Instanziierung oder Lage ihrer Abhängigkeiten Steuerung durch direkten Aufbau von Klassen, oder einen Mechanismus wie den Service Locator Muster

Frühlings-Rahmen-referance.pfd Seite 27 (wenn alle PDF-Dokument Seiten zu zählen, ist es in Seite 51)

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/pdf/spring-framework-reference.pdf

Beantwortet am 24/01/2013 um 15:52
quelle vom benutzer

stimmen
3

Inversion of Control ist , wenn Sie in den Supermarkt gehen und Ihre Frau haben Sie die Liste der Produkte zu kaufen.

Programmtechnisch übergeben sie eine Rückruffunktion getProductList()auf die Funktion , die Sie ausführen doShopping();

Es ermöglicht dem Benutzer der Funktion einige Teile davon zu definieren, um sie flexibler zu machen.

Beantwortet am 15/12/2017 um 18:35
quelle vom benutzer

stimmen
3

Um das Konzept zu verstehen, Inversion of Control (IoC) oder Dependency Inversion Principle (DIP) umfasst zwei Aktivitäten: Abstraktion und Inversion. Dependency Injection (DI) ist nur einer der wenigen der Inversionsverfahren.

Um mehr über dieses lesen können Sie mein Blog lesen Hier

  1. Was ist es?

Es ist eine Praxis, wo Sie das tatsächliche Verhalten von außerhalb der Grenze (Klasse in Object Oriented Programming) kommen lassen. Die Grenze Einheit kennt nur die Abstraktion (zB Schnittstelle, abstrakte Klasse, Delegierter in Object Oriented Programming) davon.

  1. Welche Probleme hat es zu lösen?

Im Begriff der Programmierung, versuchen IoC monolithischen Code zu lösen, indem es modular zu machen, verschiedene Teile davon entkoppeln, und es Einheit prüfbar machen.

  1. Wann ist es angebracht und wann nicht?

Es ist angebracht, die meiste Zeit, es sei denn, Sie Situation, wo Sie gerade monolithischen Code wollen (zB sehr einfaches Programm)

Beantwortet am 03/06/2016 um 01:46
quelle vom benutzer

stimmen
3

ein Objekt innerhalb Klasse erstellen wird eine enge Kopplung genannt, entfernt Frühling diese Abhängigkeit durch ein Entwurfsmuster folgende (DI / IOC). In dem Objekt der Klasse in in Konstruktor übergibt, statt in der Klasse zu schaffen. Mehr über uns Super Klassenreferenzvariable in Fertigungsbetriebs allgemeinere Struktur zu definieren.

Beantwortet am 13/05/2015 um 08:52
quelle vom benutzer

stimmen
3
  1. So Nummer 1 oben . Was ist Inversion of Control?

  2. Die Wartung ist die Nummer eins, was es für mich löst. Es garantiert, ich bin mit Schnittstellen, so dass zwei Klassen nicht miteinander intim sind.

Bei der Verwendung besser einen Behälter wie Schloss Windsor, löst es Wartungsprobleme selbst. Die Möglichkeit, eine Komponente zu tauschen, die für eine auf eine Datenbank geht, die ohne Änderung einer Codezeile Datei-basierte Persistenz verwendet, ist genial (Konfigurationsänderung, sind Sie fertig).

Und wenn Sie in Generika zu bekommen, es kommt noch besser. Stellen Sie sich eine Nachricht Verleger hat, die Aufzeichnungen und veröffentlicht Nachrichten empfängt. Es kümmert sich nicht darum, was es veröffentlicht, aber es braucht einen Mapper etwas aus einem Datensatz auf eine Nachricht zu nehmen.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

Ich schrieb es einmal, aber jetzt kann ich viele Arten in diese Reihe von Code injizieren, wenn ich verschiedene Arten von Nachrichten zu veröffentlichen. Ich kann auch Mapper schreiben, die eine Aufzeichnung des gleichen Typs nehmen und ordnet sie auf verschiedene Nachrichten. Mit DI mit Generics hat mir die Möglichkeit gegeben sehr wenig Code zu schreiben, viele Aufgaben zu erfüllen.

Oh ja, es gibt Testbarkeit Bedenken, aber sie sind sekundär zu den Vorteilen der IoC / DI.

I am loving definitiv IoC / DI.

3 . Es wird besser geeignet die Minute, die Sie ein mittelgroßes Projekt von etwas mehr Komplexität haben. Ich würde sagen, es wird angemessen die Minute, die Sie fühlen Schmerzen beginnen.

Beantwortet am 19/09/2008 um 05:59
quelle vom benutzer

stimmen
2

Mit IoC Sie Ihre Objekte nicht new'ing auf. Ihr IoC-Container wird das tun und verwalten, die Lebensdauer von ihnen.

Sie löst das Problem, manuell jede Instanziierung einer Art von Objekt zu einem anderen zu wechseln.

Es ist sinnvoll, wenn Sie die Funktionalität haben, die sich in Zukunft ändern kann oder dass in Abhängigkeit von der Umgebung oder Konfiguration verwendet in verschieden sein.

Beantwortet am 16/07/2015 um 16:06
quelle vom benutzer

stimmen
1

Die erste Version von Java EE (J2EE zu der Zeit) wurde das Konzept der Inversion of Control (IoC), was bedeutet, dass der Behälter der Kontrolle über Ihr Unternehmen Code nehmen und technische Dienstleistungen (wie Transaktion oder Sicherheitsmanagement) zur Verfügung stellen.

Beantwortet am 03/04/2017 um 22:42
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more