我仍然无法理解如何集成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运行一段时间,但到目前为止失败了。有关于这方面的好书吗?
答案 0 :(得分:0)
看来class ApiClient<R extends Request>
的一般性质是问题所在。对于每个API调用,我都需要将此子类化(例如:class AuthClient extends ApiClient<AuthRequest>
并注入到这些子类中。这实际上在某种程度上减少了Dagger2的效用,但我打算坚持下去。
答案 1 :(得分:0)
您正在向客户端中注入ServerConfiguration
,但是在您要通知Dagger
来注入此依赖项的情况下,因此它无法实例化ServerConfiguration
。
有两种解决方法:
component.inject(<Your current class>)
。ServerConfiguration
对象的构造函数注入。因此,无论何时Dagger或您要创建API client class
的实例,都将需要ServerConfiguration
实例。这是您的API客户端崩溃的主要原因。
希望有帮助。