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).