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!

War es hilfreich?

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 und EmailGateway
  • Daten ist genau das: ein Date, ein Map<String,InetAddress> oder sogar ein Customer. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top