2013-12-19 10 views
5

Ein kleines Beispiel für ein Modul, das eine Klasse Foo injiziert:Mit @Singleton ohne @Provides in Dolch

@Module(complete = false, injects = { Foo.class }) 
class MyModule { } 

class Foo { 
    @Inject 
    Foo(Bar bar, Baz baz) { } 
} 

(unter der Annahme, dass Bar und Baz von einem anderen Modul zur Verfügung gestellt werden)

Ich mag jetzt Foo um ein Singleton zu sein.

Ich könnte eine @Provides Methode hinzufügen und mit Anmerkungen versehen es mit @Singleton ...

@Module(complete = false, injects = { Foo.class }) 
class MyModule { 
    @Provides @Singleton Foo provideFoo(Bar bar, Baz baz) { 
     return new Foo(bar, baz); 
    } 
} 

... aber mit diesem Konstruktor Aufruf schreiben ich besiegt Art von dem Zweck einer Injektion Rahmen verwendet wird. Gibt es einen kürzeren Weg, dies zu erreichen?

Antwort

3

tl; dr

Sie @Singleton zu class Foo {} hinzufügen und wenn Foo über implizite Bindung instanziiert wird, wird es als @Singleton gebunden. zB:

@Module(complete = false, injects = { Foo.class }) 
class MyModule { } 

@Singleton 
class Foo { 
    @Inject 
    Foo(Bar bar, Baz baz) { } 
} 

Scope

Der Nachteil hier ist, dass, wenn es implizit gebunden ist, aber nicht genannt, in einem Root-Graph, Erweiterung Graphen (.plus() erzeugte Graphen) unbeabsichtigt instanziieren Sie es, also müssen Sie es entweder als Einstiegspunkt (injects =) deklarieren (was Sie in Ihrem Beispiel getan haben), oder es muss von etwas konsumiert werden, das von einem Einstiegspunkt erreichbar ist.

Wenn Sie .plus() nicht für Scoping/Lifetime Management verwenden, ist dieser letzte Punkt nicht so wichtig. Aber @Singleton bedeutet ein-pro-Graph, und die impliziten Bindungen von Graphen werden nur bei Bedarf realisiert. Eine bevorstehende Funktion, mit der benutzerdefinierte Bereichsanmerkungen verwendet werden können, fängt diese Fehler auf.

+1

Ah, ich habe die Dokumentation falsch gelesen - ich habe auf den Ausdruck "dient als Dokumentation" geklammert, also nahm ich an, dass @Singleton auf einer Klasse keine praktische Wirkung hat, vernachlässige den ersten Satz in diesem Abschnitt zu lesen . –

+0

Gibt es hier Änderungen für Dagger2? –

Verwandte Themen