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ê?

questionAnswers(1)

yourAnswerToTheQuestion