Injeções aninhadas / recursivas com punhal
Ao usar o Dagger, quais abordagens permitirão instanciação fácil / gratuita dos campos @Inject em objetos que também são instanciados por injeção.
Por exemplo, o código abaixo injeta um objeto do tipo Bar em um determinado objeto Foo. Isso será feito de uma das duas maneiras exibidas. No entanto, o campo Sly de cada objeto Bar não corresponde a esse comportamento.
Foo
public class Foo {
@Inject Bar bar;
public String getValue() {
return "Foo's bar value: " + bar.getValue();
}
}
Bang
public class Bar {
@Inject Sly sly;
public String getValue() {
return "Bar's sly value: " + sly.getValue();
}
}
Sly
public class Sly {
public String getValue() {
return "Hey!";
}
}
Módulo
@Module(
injects = {
Foo.class,
Bar.class
}
)
public class ExampleTestModule {
@Provides
Bar provideBar() {
return new Bar();
}
@Provides
Sly provideSly() {
return new Sly();
}
}
Testes
public void testWorksWithInject() {
Foo foo = new Foo();
ObjectGraph.create(new ExampleTestModule()).inject(foo);
assertEquals("...", foo.getValue()); // NullPointerException
}
public void testWorksWithGet() {
Foo foo = ObjectGraph.create(new ExampleTestModule()).get(Foo.class);
assertEquals("...", foo.getValue()); // NullPointerException
}
Em ambos os casos, o Bar's Sly não está sendo instanciado / @ Injetado. Obviamente, Dagger permite a injeção de construtores, o que resolve o problema. Gostaria de saber se existem alternativas para colocar essas classes na lista de parâmetros dos construtores. O que funciona bem para você?