2014-06-26 10 views
5

Rozważmy moduł Dagger:Traceback na Dagger .plus() w niekompletnym rodzica

@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. 
} 

kontekście jest obiekt może być połączony np sesja HTTP , które nie mogą być znane na starcie, kiedy normalnie utworzyć wykresu:

@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; } 
     }; 
    } 
} 

Zważywszy, że moduł jest wystarczająco długi, wydaje się, aby sensu najpierw utworzyć wykres dla modułu:

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

a następnie przeróbki konkretnego żądania, aby utworzyć unikalną wykres, który powoduje, że wykres pełnej:

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

Jednak .plus() wydaje się zakładać, że odziedziczyła wykres jest kompletna:

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) 

Czy ja źle co .plus() robi lub jest to ograniczenie w Dagger? Czy jest jakiś inny prosty sposób, aby wprowadzić użytkownika późno na wykres? (Byłoby irytujące, jeśli każdy zapewnić w Module musiałby patrzeć użytkownika z ThreadLocal lub coś takiego).

Odpowiedz