Вложенные / рекурсивные инъекции с помощью кинжала
При использовании Dagger, какие подходы позволят свободно / легко создавать экземпляры полей @Inject для объектов, которые также создаются посредством внедрения.
Например, приведенный ниже код вставит объект типа Bar в заданный объект Foo. Это будет сделано любым из двух отображаемых способов. Однако поле Sly каждого объекта Bar не соответствует этому поведению.
Foo
public class Foo {
@Inject Bar bar;
public String getValue() {
return "Foo's bar value: " + bar.getValue();
}
}
бах
public class Bar {
@Inject Sly sly;
public String getValue() {
return "Bar's sly value: " + sly.getValue();
}
}
лукавый
public class Sly {
public String getValue() {
return "Hey!";
}
}
модуль
@Module(
injects = {
Foo.class,
Bar.class
}
)
public class ExampleTestModule {
@Provides
Bar provideBar() {
return new Bar();
}
@Provides
Sly provideSly() {
return new Sly();
}
}
тесты
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
}
В любом случае, Sly Бар не создается / @ Injected. Конечно, Dagger допускает инжекцию конструктора, что решает проблему. Я хотел бы знать, есть ли альтернативы для включения этих классов в список параметров конструкторов. Что работает для вас хорошо?