Dependency Injection mit Guice: Etwas, das von jedem Tutorial nicht abgedeckt ist
-
10-07-2019 - |
Frage
i gebastelt nur um mit Google Guice für Injection Abhängigkeit und begann zu integrieren es in meine bestehende Anwendung. So weit, ist es gut. Ich habe viele Klassen, die brauchen, neben ihren Abhängigkeiten, Streicher, Datasources, et cetera. Ich weiß, es gibt NamedBindings, aber ich möchte wirklich nicht eine Anmerkung für jeden einfachen String i für jede Klasse an den Konstruktor übergeben haben erstellen. Dann gibt es ein Ding namens AssistedInject, die Schaffung Fabrik implementions für mich. Wow, aber ich habe immer noch die Schnittstelle der Fabrik zu definieren. Das ist in Ordnung für Klassen, die Abhängigkeiten nicht installiert haben, aber was ist mit diesem Beispiel Klasse:
public class FooBarClass {
public FooBarClass(String name, String anotherOne) {
// Some stuff
}
}
Es gibt Fälle, in denen ich im Zweifel bin, wie Guice zu verwenden, oder, allgemeiner, DI der richtige Weg. "Oft höre ich: XYZ-Framework das neue neu ." Aber dies implizit, dass ich schaffen müssen alle Instanz mit dem DI-Framework.
Nur eine Instanz ist erforderlich
Was passiert, wenn ich nur eine Instanz dieser Klasse müssen? Diese Klasse hat absolut keine Abhängigkeiten neben zwei Strings. Denken Sie an einen Shutdown-Haken, die nur einmal instanziiert werden und der JVM als meine Shutdown Hook übergeben. Soll ich diese Instanz mit Guice erstellen? Das sieht sehr dumm für mich, weil es nichts zu injizieren, aber ich habe eine Fabrik-Schnittstelle schreiben Führer beiden Parameter zu übergeben und eine Schnittstelle schaffen muß, um für meinen FooBarClass DI zu verwenden.
Mehrere Instanzen erforderlich
Das gleiche gilt für einen Fall, wo ich mehrere Instanzen dieser Klasse müssen. Keine Abhängigkeiten, aber ich habe eine Reihe von Standardcode erstellen nichts aus ihm heraus zu bekommen. Dies scheint falsch zu mir.
Also, wie soll ich verwenden DI und / oder Guice?
Vielen Dank!
Lösung
Es könnte helfen, spalten Abhängigkeiten Daten .
- Abhängigkeiten sind häufig Dienste: Datenbanken, Uhren und RPC-Stubs. Plus alle der Anwendungscode überlagert auf diese:.
UserAuthenticator
,PaymentHandler
undEmailGateway
- Daten ist genau das: ein
Date
, einMap<String,InetAddress>
oder sogar einCustomer
. Dies sind einfache, In-Memory-Domänenobjekte.
DI ist natürlich am besten geeignet für die Abhängigkeit Seite der Dinge. Sie sollten weiterhin new
für Ihre Datenmodellklassen verwenden.
Andere Tipps
Wenn Sie mehrere Instanzen wie einzelne Kunden schaffen, macht es keinen Sinn machen, sie zu injizieren. was Sinn macht, ist eine CustomerFactory zu schaffen, der Rahmen @Singleton werden kann, die Kundeninstanzen mit all ihren Abhängigkeiten zu schaffen.
Injizieren Sie eine Abhängigkeit, wenn Sie ignorieren möchten (Isolat) seine Komplexität, wenn eine bestimmte Klasse zu testen. Wenn die Klasse nur ein Dateninhaber ist, dessen Code ist trivial (get, set, entspricht). Sie brauchen es nicht zu spotten, wenn die Zielklasse zu testen, so dass die Dateninstanz Injektion ist übertrieben (und in der Regel hart). Wenn der Code nicht trivial ist, ist die Klasse mehr als ein Datenbehälter, und Sie sollten es auf Unit-Tests injizieren und verspotten.