我仍然无法理解如何集成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的效用,但我打算坚持下去。
您正在客户端中注入ServerConfiguration
,但是在通知Dagger
来注入此依赖项的情况下,因此它无法实例化ServerConfiguration
。
有两种解决方法:
component.inject(<Your current class>)
。ServerConfiguration
对象的构造函数注入。因此,无论何时Dagger或您要创建API client class
的实例,都将需要ServerConfiguration
实例。这是您的API客户端崩溃的主要原因。
希望有帮助。