我可以使用某种辅助的Inject with Dagger吗?

con*_*ile 2 java gwt-gin guice dagger dagger-2

使用Google Guice或Gin我可以指定参数不受依赖注入框架控制:

class SomeEditor {


  @Inject
  public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
  }

}
Run Code Online (Sandbox Code Playgroud)

辅助参数stageSomeEditor创建实例时指定.

SomeClassA的实例取自对象图,SomeClassB的实例在运行时从调用者获取.

在Dagger中有类似的方法吗?

Jef*_*ica 5

因为工厂是一种独立的样板来进行优化(参见此处的邮件列表讨论),Dagger将其留给了一个姐妹项目AutoFactory.这提供了Guice通过FactoryModuleBuilder提供的" 辅助注入 "功能,但具有一些额外的好处:

  • 您可以继续使用带有Guice或Dagger的AutoFactory或任何其他JSR-330依赖注入框架,这样即使您在它们之间切换,也可以继续使用AutoFactory.
  • 因为AutoFactory生成代码,所以您不需要编写一个接口来表示构造函数:AutoFactory将编写一个全新的类型供您编译.(如果您愿意,也可以指定要实现的接口,或者如果您要从Guice迁移.)
  • 因为所有类型检查都是在编译时发生的,所以它会产生普通的旧Java,它不会因为反射而变慢,并且适用于调试器和优化器.这使得Auto库对Android开发特别有用.

例如,来自AutoFactory自述,这将产生一拉SomeClassFactoryprovidedDepA@Inject-annotated构造函数和depB在一个create方法:

@AutoFactory
final class SomeClass {
  private final String providedDepA;
  private final String depB;

  SomeClass(@Provided @AQualifier String providedDepA, String depB) {
    this.providedDepA = providedDepA;
    this.depB = depB;
  }

  // …
}
Run Code Online (Sandbox Code Playgroud)