Der Schlüssel von DI-Containern ist die Abstraktion . DI-Behälter abstrahieren dieses Designanliegen für Sie. Wie Sie sich vorstellen können, hat dies spürbare Auswirkungen auf den Code, der häufig in weniger Konstrukteure, Setter, Fabriken und Builder übersetzt wird. Infolgedessen wird Ihr Code (aufgrund der zugrunde liegenden IoC ) lockerer , sauberer und einfacher gekoppelt . Obwohl nicht ohne Kosten.
Hintergründe
Vor Jahren mussten wir für eine solche Abstraktion verschiedene Konfigurationsdateien schreiben ( deklarative Programmierung ). Es war fantastisch zu sehen, wie sich die Anzahl der LOCs erheblich verringerte, aber während die LOCSs abnahmen, stieg die Anzahl der Konfigurationsdateien leicht an. Für mittlere oder kleine Projekte war es überhaupt kein Problem, aber für größere Projekte wurde das Problem, dass die "Assemblierung des Codes" zu 50% zwischen Code- und XML-Deskriptoren verstreut war, zu einem ... Das Hauptproblem war jedoch das Paradigma selbst. Es war ziemlich unflexibel, weil die Deskriptoren wenig Platz für Anpassungen ließen.
Das Paradigma verlagerte sich zunehmend in Richtung Konvention über Konfiguration , bei der Konfigurationsdateien gegen Anmerkungen oder Attribute ausgetauscht werden. Es hält unseren Code sauberer und einfacher und bietet uns gleichzeitig die Flexibilität, die XML nicht bieten konnte.
Dies ist wahrscheinlich der bedeutendste Unterschied in Bezug auf Ihre bisherige Arbeitsweise. Weniger Code und mehr Magie.
Auf der Unterseite...
Konvention über Konfiguration macht die Abstraktion so schwer, dass Sie kaum wissen, wie es funktioniert. Manchmal magisch und hier kommt noch ein Nachteil. Sobald es funktioniert, kümmern sich viele Entwickler nicht mehr darum, wie es funktioniert.
Dies ist ein Handicap für diejenigen, die DI mit DI-Containern gelernt haben. Sie verstehen die Relevanz der Entwurfsmuster, der bewährten Verfahren und der Prinzipien, die vom Container abstrahiert wurden, nicht vollständig. Ich habe Entwickler gefragt, ob sie mit DI und seinen Vorteilen vertraut sind, und sie haben geantwortet: - Ja, ich habe Spring IoC verwendet -. (Was zur Hölle heißt das?!?)
Man kann jedem dieser "Nachteile" zustimmen oder nicht. Meiner bescheidenen Meinung nach ist es ein Muss zu wissen, was in Ihrem Projekt vor sich geht. Ansonsten haben wir kein vollständiges Verständnis davon. Es ist auch von Vorteil, zu wissen, wofür DI ist, und eine Vorstellung davon zu haben, wie es implementiert werden soll.
Auf der positiven Seite...
Ein Wort Produktivität . Mit Frameworks können wir uns auf das konzentrieren, was wirklich wichtig ist. Das Geschäft der Anwendung.
Trotz der bemerkten Mängel sind diese Tools für viele von uns (welcher Job durch Termine und Kosten bedingt ist) eine unschätzbare Ressource. Meiner Meinung nach sollte dies unser Hauptargument für die Implementierung eines DI-Containers sein. Produktivität .
Testen
Unabhängig davon, ob wir reine DI oder Container implementieren, ist das Testen kein Problem. Ganz im Gegenteil. Die gleichen Behälter liefern uns oft die Mocks für Unit-Tests aus der Box. Im Laufe der Jahre habe ich meine Tests als Thermometer verwendet. Sie sagen mir, ob ich mich stark auf die Containereinrichtungen verlassen habe. Ich sage das, weil diese Container private Attribute ohne Setter oder Konstruktoren initialisieren können. Sie können Bauteile fast überall einspritzen!
Klingt verlockend, oder? Achtung! Fallen Sie nicht in die Falle !!
Vorschläge
Wenn Sie sich für die Implementierung von Containern entscheiden, empfehle ich dringend, sich an die bewährten Methoden zu halten. Implementieren Sie weiterhin Konstruktoren, Setter und Interfaces. Erzwingen Sie die Verwendung des Frameworks / Containers . Dies erleichtert die Migration in ein anderes Framework oder das Entfernen des eigentlichen Frameworks. Dies kann die Abhängigkeit vom Container erheblich verringern.
In Bezug auf diese Praktiken:
Wann sind DI-Container zu verwenden?
Meine Antwort wird durch die eigenen Erfahrungen verzerrt sein, die hauptsächlich für DI-Container sprechen (wie ich bemerkte, konzentriere ich mich stark auf Produktivität, so dass ich nie die Notwendigkeit einer reinen DI hatte. Ganz im Gegenteil).
Ich denke, Sie werden einen interessanten Artikel von Mark Seeman zu diesem Thema finden, der auch die Frage beantwortet, wie man reine DI implementiert .
Wenn wir schließlich von Java sprechen, würde ich zunächst einen Blick auf JSR330 - Dependency Injection werfen .
Zusammenfassend
Vorteile :
- Kostensenkung und Zeitersparnis. Produktivität.
- Eine kleinere Anzahl von Komponenten.
- Der Code wird einfacher und sauberer.
Nachteile :
- DI wird an Drittanbieter-Bibliotheken delegiert. Wir sollten uns ihrer Kompromisse, Stärken und Schwächen bewusst sein.
- Lernkurve.
- Sie lassen Sie schnell einige gute Gewohnheiten vergessen.
- Erhöhung der Projektabhängigkeiten (mehr Bibliotheken)
- Auf Reflexion basierende Container benötigen mehr Ressourcen (Speicher). Dies ist wichtig, wenn wir durch die Ressourcen eingeschränkt werden.
Unterschiede zu reinem DI :
- Weniger Code und mehr Konfigurationsdateien oder Anmerkungen.