Bei der Verwendung von Dolch ermöglichen diese Ansätze eine einfache Instanziierung von @Inject-Feldern auf Objekten, die ebenfalls durch Injektion instanziiert werden.Verschachtelte/rekursive Injektionen mit Dolch
Zum Beispiel wird der folgende Code ein Objekt vom Typ Bar in ein bestimmtes Foo-Objekt injizieren. Es wird dies auf eine der beiden angezeigten Arten tun. Das Sly-Feld jedes Balkenobjekts stimmt jedoch nicht mit diesem Verhalten überein.
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!";
}
}
Modul
@Module(
injects = {
Foo.class,
Bar.class
}
)
public class ExampleTestModule {
@Provides
Bar provideBar() {
return new Bar();
}
@Provides
Sly provideSly() {
return new Sly();
}
}
Tests
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
}
In jedem Fall Sly Bar ist nicht/@ injizierte instanziiert wird. Natürlich erlaubt Dagger die Konstruktorinjektion, die das Problem löst. Ich würde gerne wissen, ob es Alternativen gibt, diese Klassen in die Parameterliste von Konstruktoren zu stecken. Was funktioniert gut für dich?