Вложенные / рекурсивные инъекции с помощью кинжала

При использовании 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 допускает инжекцию конструктора, что решает проблему. Я хотел бы знать, есть ли альтернативы для включения этих классов в список параметров конструкторов. Что работает для вас хорошо?

Ответы на вопрос(1)

Ваш ответ на вопрос