使用Google Guice或Gin,我可以指定不受依赖项注入框架控制的参数:
class SomeEditor {
@Inject
public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
}
}
在创建
stage
实例时指定辅助参数SomeEditor
。SomeClassA的实例是从对象图中获取的,而SomeClassB的实例是从运行时的调用者获取的。
在Dagger中有类似的方法吗?
最佳答案
由于工厂是用于优化优化(see mailing list discussion here)的另一种样板,因此Dagger将其留给了姊妹项目AutoFactory。这提供了Guice通过assisted injection提供的“ FactoryModuleBuilder”功能,但具有一些额外的好处:
您可以继续将AutoFactory与Guice或Dagger或任何其他JSR-330依赖项注入框架一起使用,因此即使在它们之间进行切换,也可以继续使用AutoFactory。
因为AutoFactory会生成代码,所以您无需编写用于表示构造函数的接口:AutoFactory将编写一个全新的类型供您进行编译。 (如果愿意,或者从Guice迁移,也可以指定要实现的接口。)
因为所有类型检查都是在编译时进行的,所以它会生成普通的旧Java,它不会因反射而变慢,并且可以与调试器和优化器一起很好地工作。这使得Auto库对于Android开发特别有用。
例如,从AutoFactory的README中提取的,它将在SomeClassFactory
注释的构造函数中生成带有providedDepA
的@Inject
,并在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;
}
// …
}