Ich versuche, mich mit Dependency Injection zu beschäftigen.
Eines der Dinge, über die ich verwirrt bin, ist, ob all Ihrer Objekt-Instanziierung vom DI-Framework (Spring, Guice usw.) gesteuert werden muss.
Oder, wenn nicht, wie bestimmen Sie, welche Objekte vom Framework instanziiert werden und welche Objekte mit dem Operator new
instanziiert werden?
Nein, es gibt immer noch einen Platz für Neues. Nicht alle Objekte müssen unter der Kontrolle der DI-Fabrik stehen.
Sie können leicht die Klassen erkennen, die unter der Kontrolle der DI-Fabrik stehen müssen, da sie normalerweise Schnittstellen und Implementierungen umfassen.
Jedes lokale Objekt in einer Implementierung ist berechtigt, einen neuen Aufruf auszuführen. Modellobjekte, die instanziiert werden, um einen bestimmten Anwendungsfall zu erfüllen, sollten instanziiert werden, indem new aufgerufen und die Parameterwerte für diese bestimmte Instanz übergeben werden.
Ich habe diesen Beitrag von Miško gefunden Es ist sehr hilfreich, um zu unterscheiden, welche Objekte als Abhängigkeiten injiziert werden sollten und welche erstellt werden können. Er unterscheidet zwischen "newable" und "injizierbaren" Klassen.
Ich würde sagen, einfacher Objekte ohne "echte" Abhängigkeiten sollten nicht injiziert werden. Dies können Datenobjekte oder natürlich Ausnahmen und dergleichen sein.
Die Sache "Eliminate the new operator" gibt im Grunde nur eine gute Richtlinie, wo man nach DI-fähigen Sachen suchen kann.
Solange Newizing-up Sie nicht davon abhält, Verhaltensweisen für Tests zu isolieren, ist alles in Ordnung. Beispiele könnten das Erstellen von Sammlungen oder Werttypen sein, die innerhalb einer Implementierung verwendet werden, aber nicht "object work", per se.
Konzentriere dich auf das Wort "Abhängigkeit" - ist das Objekt in Frage, auf das man sich in irgendeiner Weise stützt, damit das umhüllende Objekt seinen einen wahren Zweck für das Existieren erfüllt? Wenn ja, sollte es von außen injiziert werden.
new
schließt DI-Frameworks nicht unbedingt aus. Im Frühjahr können Sie z. B. die Funktion zum Laden von Klassen verwenden, um Abhängigkeiten auszuführen Injection für jedes Objekt, das von new
erstellt wurde.
Wenn also new
und containergesteuerte DI in Java normalerweise sich gegenseitig ausschließen, ist dies keine feste Regel.
Tags und Links java spring dependency-injection new-operator guice