2013-08-20 14 views
15

Sto cercando di ottenere Dagger su un lavoro sul mio progetto.Dagger sui costruttori predefiniti

Tuttavia ottengo la seguente eccezione in una delle mie classi durante la compilazione:

error: No injectable members on Foo. Do you want to add an injectable constructor?

Tuttavia, la classe non hanno dipendenze e come tale utilizza il valore predefinito costruttore no-arg:

public class Foo 
{ 
    ... 
} 

Devo davvero aggiungere un costruttore no-arg iniettabile come di seguito?

public class Foo 
{ 
    @Inject 
    public Foo() 
    { 
    } 

    .... 
} 

risposta

21

Dagger richiede attivamente aggiungere @Inject alla classe iniettabile, sia con l'aggiunta di un costruttore no-args, o l'aggiunta di un campo iniettabile. La terza opzione è quella di restituire la classe da un metodo @Provides in questo modo:

@Module(...) 
class MyModule { 
    @Provides Foo provideFoo() { 
    return new Foo(); // Foo is not injectable. 
    } 
} 

Questo non sembrare boilerplate in più, ma per esperienza con Guice e altri framework, JIT legame di classi a caso risulta essere piena di errore. Abbiamo visto java.lang.String iniettato nelle cose, e poiché qualcuno ha dimenticato di associarlo, si è finito con "" iniettato invece della stringa desiderata. Dagger, quindi, richiede un costruttore o un campo @Inject. (Guice lo ha facoltativamente in 4.x, anche se per compatibilità all'indietro, è disattivato per impostazione predefinita)

Questo è un caso raro in cui Dagger ha scelto più garanzie di correttezza al costo di una piccola quantità di verbosità.

Problemi correlati