java - 如何将一些注入和一些提供的类放入提供的类中
问题描述
我开始使用 Dagger 2 并试图弄清楚如何获得@Inject
并@Provides
很好地协同工作。注入顶级类时,很容易让一切正常工作。像这样:
class TopLevelClass {
@Inject
SecondaryClass1 class1;
private final SecondaryClass2 class2;
@Inject
TopLevelClass(SecondaryClass2 class2) {
this.class2 = class2;
}
}
@Module
class MyModule {
@Provides
SecondaryClass2 provideSecondaryClass2() {
return new SecondaryClass2();
}
}
但是,当我也必须@Provides
为顶级类创建方法时,一切都会停止工作。像这样:
class TopLevelClass {
@Inject
SecondaryClass1 class1;
private final SecondaryClass2 class2;
TopLevelClass(SecondaryClass2 class2) {
this.class2 = class2;
}
}
@Module
class MyModule {
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2) {
return new TopLevelClass(class2);
}
@Provides
SecondaryClass2 provideSecondaryClass2() {
return new SecondaryClass2();
}
}
在这个例子中,我发现 SecondaryClass1 永远不会被注入,所以当我尝试访问它时会得到一个 NPE。对于提供的顶级课程,我应该以不同的方式执行此操作吗?
PS我认为这无关紧要,但这是我正在使用的组件,以防万一:
@Component(modules = {MyModule.class})
interface MyComponent {
TopLevelClass getTopLevelClass();
}
谢谢!
解决方案
您有 2 个选项:
- 利用构造函数注入,让 Dagger 创建并注入对象(无需任何
@Provides
注解的方法) 对象无需任何代码即可使用。这就是匕首闪耀的地方。 - 自己创建对象并确保在从带
@Provides
注释的方法返回之前正确设置它
我不知道您为什么更喜欢第二个选项,或者为什么在可以使用构造函数时甚至要使用字段注入,但是,正如您所发现的,如果您手动构造字段,则不会注入字段目的。生成的 Dagger 代码都不会运行——您必须自己执行此操作。
想到的一种方法是请求组件,然后注入对象。
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
TopLevelClass tlc = new TopLevelClass(class2);
component.inject(tlc);
return tlc;
}
推荐阅读
- php - 在 PHP 扩展 C++ 中获取函数返回值
- reactjs - Redux Saga - 将类似(但不是全部)的操作分组到 takeLeading / takeLatest
- bash - 使用脚本变量执行 bash 命令,其中包含可执行工具的空间路径?
- java - MySQL JDBC 极其冗长
- javascript - django 选择字段值
- node.js - 如何在 Cent OS 7 中清除 node.js 终端
- c# - 从 C# 驱动程序向本地托管的 Mongodb 服务器发出查询
- python - 如何添加具有不同长度的三个不同值的列?
- r - 仅使用插入符号指定最终模型的选项
- javascript - D3 - 鼠标悬停矩形宽度