android - 为什么我的带有 Dagger2 实现的 DI 崩溃了?
问题描述
我仍然无法理解 Dagger2 需要如何集成。我正在使用 Java 进行编码,并且大多数教程都是在 Kotlin 中编写的,对此我不是很熟悉。
我有这个需要注入的类:
package org.example.client;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class ServerConfiguration {
private String mServer;
@Inject
public ServerConfiguration() {
this.mServer = "https://api.example.org";
}
public String getServer() {
return mServer;
}
}
我有这个需要上述课程的ServerConfiguration
课程:
package org.example.client;
import android.util.Log;
public class ApiClient<R extends Request> {
@Inject
ServerConfiguration mConfiguration;
protected ApiClient(Builder<R> builder) {
if (mConfiguration == null) {
logd("Injection failed.");
} else {
logd("Injection succeeded.");
}
logd("Server = " + mConfiguration);
}
public void execute() {
logd("Executing: " + mConfiguration.getServer());
}
private static void logd(String m) {
Log.d("ApiClient", m);
}
public static class Builder<R extends Request> {
public ApiClient<R> build() {
return new ApiClient<>(builder);
}
}
我的期望是在其他地方,我可以使用new ApiClient.Builder<SomeRequest>().set().build().execute()
它并完成它。我需要在每个请求的基础上设置的任何内容都将通过 Builder 的 set() 方法完成,而在每个服务器的基础上所需的任何内容都将通过 ServerConfiguration 类中的设置器完成。具体来说,对于这个基本用例,我不需要模块或组件——Dagger 会注意到 @Inject 注释,弄清楚如何构造 ServerConfiguration 对象并确保由于 @Singleton 而只完成一次。我这里的理解似乎不正确,因为我得到的是日志条目“注入失败”。在所有情况下(以及 execute() 中的 NPE)。我哪里错了?
我一直试图让 Dagger2 运行一段时间,但到目前为止失败了。有没有关于这个主题的好书?
解决方案
看来,class ApiClient<R extends Request>
问题的一般性质。对于每个 API 调用,我都需要对其进行子类化(例如:class AuthClient extends ApiClient<AuthRequest>
并注入这些子类。这实际上在一定程度上降低了 Dagger2 的实用性,但我打算坚持下去。
推荐阅读
- javascript - Js:当大括号括起来变量声明时会发生什么?
- git - 我们可以从 GIT 存储库中导出本地提交并将它们导入另一个系统吗
- ruby-on-rails - Rails cron 作业运行
- python - 无效的 HTTP_HOST 标头:“0.0.0.0:8000”。您可能需要将“0.0.0.0”添加到 ALLOWED_HOSTS
- python - 如何过滤 .CSV 文件中的列,然后将这些过滤后的列保存到 Python 中的新 .CSV 文件中?
- javascript - 防止单文件组件的无样式内容闪烁
- python - 在服务器上运行时,我在浏览器上获取 HTML 代码
- c# - c#数据表单元格更新问题
- powershell - 检查 Bitsadmindownload 是否在 Powershell 中成功
- json - API 测试/REST 保证自动化测试建议和/或建议