使用 Google Guice 或 Gin,我可以指定不受依赖注入(inject)框架控制的参数:
class SomeEditor {
@Inject
public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
}
}
辅助参数 stage
在创建 SomeEditor
实例时指定。
SomeClassA 的实例取自对象图,SomeClassB 的实例取自运行时的调用者。
在 Dagger 中有类似的方法吗?
最佳答案
更新:截至Dagger 2.31从 2021 年 1 月开始,现在使用 Dagger natively supports assisted injection ,即 recommended over the Square and Auto options . (那些其他选项仍然有效,但与 native 选项相比可能需要额外设置。)
class SomeEditor {
@AssistedInject public SomeEditor(
SomeClassA a, @Assisted SomeClassB b) {
// ...
}
}
@AssistedFactory interface SomeEditorFactory {
SomeEditor create(SomeClassB b);
}
(原始答案)
因为工厂是一种需要优化的独立样板文件类型 (see mailing list discussion here),Dagger 将它留给了一个姊妹项目,AutoFactory .这提供了 Guice 通过 assisted injection 提供的“FactoryModuleBuilder ”功能,但有一些额外的好处:
- 您可以继续将 AutoFactory 与 Guice 或 Dagger 或任何其他 JSR-330 依赖项注入(inject)框架一起使用,因此即使您在它们之间切换,也可以继续使用 AutoFactory。
- 因为 AutoFactory 生成代码,所以您不需要编写接口(interface)来表示构造函数:AutoFactory 会编写一个全新的类型供您编译。 (如果您愿意,或者如果您要从 Guice 迁移,您也可以指定要实现的接口(interface)。)
- 因为所有类型检查都发生在编译时,它会生成普通的旧 Java,不会因反射而导致任何缓慢,并且可以很好地与调试器和优化器配合使用。这使得 Auto 库对 Android 开发特别有用。
示例,从 AutoFactory 的自述文件中提取,它将生成一个 SomeClassFactory
,在一个 @Inject
注释的构造函数和 depB 中使用
在 providedDepA
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;
}
// …
}
关于java - 我可以使用 Dagger 的某种辅助注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29175014/