首页 > 解决方案 > 为什么我的带有 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 运行一段时间,但到目前为止失败了。有没有关于这个主题的好书?

标签: androiddependency-injectiondagger-2

解决方案


看来,class ApiClient<R extends Request>问题的一般性质。对于每个 API 调用,我都需要对其进行子类化(例如:class AuthClient extends ApiClient<AuthRequest>并注入这些子类。这实际上在一定程度上降低了 Dagger2 的实用性,但我打算坚持下去。


推荐阅读