为什么我的Dagger2实现的DI崩溃了?

时间:2019-12-11 03:28:26

标签: android dependency-injection dagger-2

我仍然无法理解如何集成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运行一段时间,但到目前为止失败了。有关于这方面的好书吗?

2 个答案:

答案 0 :(得分:0)

看来class ApiClient<R extends Request>的一般性质是问题所在。对于每个API调用,我都需要将此子类化(例如:class AuthClient extends ApiClient<AuthRequest>并注入到这些子类中。这实际上在某种程度上减少了Dagger2的效用,但我打算坚持下去。

答案 1 :(得分:0)

您正在向客户端中注入ServerConfiguration,但是在您要通知Dagger来注入此依赖项的情况下,因此它无法实例化ServerConfiguration

有两种解决方法:

  1. 您可以通知Dagger,它将进行现场注入。例如: component.inject(<Your current class>)
  2. 您可以在API客户端构造函数中执行ServerConfiguration对象的构造函数注入。因此,无论何时Dagger或您要创建API client class的实例,都将需要ServerConfiguration实例。

这是您的API客户端崩溃的主要原因。

希望有帮助。