Dependency Injection with Guice: Etwas, das in keinem Tutorial behandelt wird

7

Ich habe gerade mit Google Guice für Dependency Injection herumgebastelt und angefangen, es in meine bestehende Anwendung zu integrieren. So weit, ist es gut. Ich habe viele Klassen, die neben ihren Abhängigkeiten Strings, DataSources und so weiter benötigen. Ich weiß, dass es NamedBindings gibt, aber ich möchte wirklich keine Annotation für jeden einfachen String erstellen, den ich für jede Klasse an den Konstruktor übergeben muss. Dann gibt es eine Sache namens AssistedInject, die Factory-Implementierungen für mich erstellt. Wow, aber ich muss immer noch die Schnittstelle der Fabrik definieren. Das ist in Ordnung für Klassen, die Abhängigkeiten haben, aber was ist mit dieser Beispielklasse:

%Vor%

Es gibt Fälle, in denen ich Zweifel habe, wie Guice oder, allgemeiner gesagt, DI der richtige Weg ist. "Oft höre ich: XYZ Framework ist das neue new ." Aber implizit muss ich jede Instanz mit dem DI-Framework erstellen.

Es wird nur eine Instanz benötigt

Was ist, wenn ich nur eine Instanz dieser Klasse brauche? Diese Klasse hat absolut keine Abhängigkeiten neben zwei Strings. Denken Sie an einen Abschalt-Hook, der nur einmal installiert und als Abschalt-Hook an die JVM übergeben wird. Soll ich diese Instanz mit Guice erstellen? Das sieht sehr dumm für mich aus, weil es nichts zu injizieren gibt, aber ich muss eine Factory-Schnittstelle schreiben, um Guide beide Parameter zu übergeben und muss eine Schnittstelle für meine FooBarClass erstellen, um DI zu verwenden.

Mehrere Instanzen sind erforderlich

Dasselbe gilt für einen Fall, in dem ich mehrere Instanzen dieser Klasse benötige. Keine Abhängigkeiten, aber ich muss eine Menge Code erstellen, um nichts daraus zu machen. Das scheint mir falsch zu sein.

Also, wie soll ich DI und / oder Guice verwenden?

Vielen Dank!

    
Malax 24.06.2009, 13:46
quelle

3 Antworten

23

Es kann hilfreich sein, Abhängigkeiten von Daten zu trennen.

  • Abhängigkeiten sind häufig Dienste: Datenbanken, Uhren und RPC-Stubs. Hinzu kommt der gesamte Anwendungscode, der auf diesen Ebenen liegt: UserAuthenticator , PaymentHandler und EmailGateway .
  • Daten sind genau das: a Date , a Map<String,InetAddress> oder sogar% Customer . Dies sind einfache, speicherinterne Domänenobjekte.

DI ist natürlich am besten für die Abhängigkeitsseite der Dinge geeignet. Sie sollten weiterhin new für Ihre Datenmodellklassen verwenden.

    
Jesse Wilson 25.06.2009, 00:35
quelle
2

Wenn Sie mehrere Instanzen erstellen, z. B. einzelne Kunden, ist es nicht sinnvoll, sie zu injizieren. Sinnvoll ist es, eine CustomerFactory zu erstellen, bei der es sich um den @Singleton-Bereich handeln kann, der Kundeninstanzen mit allen Abhängigkeiten erstellen kann.

    
Andreas Petersson 09.07.2009 07:15
quelle
2

Injizieren Sie eine Abhängigkeit, wenn Sie ihre Komplexität beim Testen einer bestimmten Klasse ignorieren (isolieren) wollen. Wenn die Klasse nur ein Dateninhaber ist, ist ihr Code trivial (get, set, equals). Sie müssen sich beim Testen der Zielklasse nicht darüber lustig machen, also ist das Injizieren der Dateninstanz übertrieben (und normalerweise schwer). Wenn der Code nicht trivial ist, ist die Klasse mehr als ein Datenbehälter, und Sie sollten ihn bei Komponententests injizieren und verspotten.

    
Fernando 14.07.2009 13:29
quelle