2013-04-06 23 views
5

In Guice, ho avuto il pieno controllo su quando i moduli sono stati costruiti e ho usato alcuni moduli con gli argomenti del costruttore che ho installato.Moduli Dagger con argomenti del costruttore?

In Dagger, tuttavia, il metodo di riferimento di altri moduli è rappresentato da @Module che include l'annotazione e non presenta lo stesso metodo di creazione dei moduli da installare.

È possibile creare un ObjectGraph sano da più moduli con argomenti del costruttore? Soprattutto quello che funzionerà con il dagger-compiler e non verrà eseguito in un grafico ciclico?

risposta

3

Se si dispone di più moduli che utilizzano lo stesso oggetto, è possibile che si debba separare tale oggetto nel proprio modulo. Ad esempio, molti dei moduli utilizzare il contesto applicazione in modo ho il seguente modulo:

@Module 
public class ContextModule { 

    private final Context mContext; 

    public ContextModule(Context context) { 
     mContext = context; 
    } 

    @Provides 
    public Context provideContext() { 
     return mContext; 
    } 

} 

Così ora in altri moduli quando quando ho bisogno di un oggetto di contesto ho appena includere il modulo.

Ad esempio:

@Module(entryPoints = { MyFragment.class }, includes = { ContextModule.class }) 
public class ServicesModule { 

    @Provides 
    public LocationManager provideLocationManager(Context context) { 

     return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    @Provides 
    public Geocoder provideGeocoder(Context context) { 
     return new Geocoder(context); 
    } 
} 

Poi quando costruire l'oggetto grafico alla fine con un solo modulo che prende il contesto applicativo come argomento.

+3

Quindi questo è simile a quello che ho già fatto, e posso fornire un costruttore per ogni modulo che passo a ObjectGraph.create() ... tuttavia, quello che ho notato è che questo si rompe se provo per estendere l'ObjectGraph usando .plus() ... a quel punto, il grafico sembra perdere la conoscenza dei moduli e delle bombe costruite in precedenza con un'eccezione quando cerca di creare un modulo incluso. – thebamaman

3

ObjectGraph.create() prende un elenco di variabili di moduli (varargs) così si è in grado di farlo:

ObjectGraph objectGraph = ObjectGraph.create(new ProductionModule(context), new OverridingTestModule()); 

Date un'occhiata a InjectionTest.java di Dagger (vedi prova "moduleOverrides" là): https://github.com/square/dagger/blob/master/core/src/test/java/dagger/InjectionTest.java

+0

Questo è corretto. Nota anche che dovresti impostare overrides = True nel modulo di prova override. –

Problemi correlati