2014-06-26 10 views
5

consideri un modulo Dagger:traceback su Dagger .Più() all'elemento principale incompleto

@Module(library = true, complete = false) 
public static class Module { 
    @Provides 
    public Contextualized providesContextualized(Context ctx) { 
     return new Contextualized(ctx.getUsername()); 
    } 
    // ... and many more such provides. 
} 

contesto è un oggetto può essere collegato ad esempio una sessione HTTP che non può essere conosciuto all'avvio, quando uno normalmente creare un grafico:

@Module(library = true, complete = false) 
public static class ContextModule { 
    private final String username; 
    public ContextModule(String username) { this.username = username; } 

    @Provides 
    public Context providesContext() { 
     return new Context() { 
      public String getUsername() { return username; } 
     }; 
    } 
} 

Poiché modulo è sufficientemente lungo, sembrerebbe fare senso creare dapprima un grafico per il modulo:

ObjectGraph baseline = ObjectGraph.create(new Module()); 

e poi, l'elaborazione di una richiesta particolare, per creare un unico grafico che rende il grafo completo:

ObjectGraph withContext = baseline.plus(new ContextModule("killroy")); 

Tuttavia, .Più() sembra presupporre che il grafico ereditato è completa:

java.lang.IllegalStateException: Errors creating object graph: 
Context could not be bound with key Context required by class PlusExample$Module 
at dagger.internal.ThrowingErrorHandler.handleErrors(ThrowingErrorHandler.java:34) 
at dagger.internal.Linker.linkRequested(Linker.java:182) 
at dagger.internal.Linker.linkAll(Linker.java:109) 
at dagger.ObjectGraph$DaggerObjectGraph.linkEverything(ObjectGraph.java:244) 
at dagger.ObjectGraph$DaggerObjectGraph.plus(ObjectGraph.java:203) 
at PlusExample.plusFailsOnIncompleteModule(PlusExample.java:46) 

ho frainteso quello che .Più() fa o si tratta di una limitazione nella Dagger? C'è un altro modo semplice per presentare l'utente in ritardo nel grafico? (Sarebbe fastidioso se ogni fornire nel modulo avrebbe dovuto cercare l'utente da un ThreadLocal o qualcosa del genere.)

risposta