Dagger 2 如何解决构造函数依赖

Dagger 2 How to solve constructor dependency

我是一名 Android 开发人员,正在努力学习 Dagger2。我已经阅读了一些教程并获得了一些基本的了解。我使用 Dagger2 开发了一个基本的 java 应用程序。下面是我的应用程序代码。

Logger.java: Logger 很简单 java class 它将打印带有一些标签的日志。

public class Logger {

    private String tag;

    @Inject
    public Logger(String tag) {
        this.tag = tag;
    }

    public void log(String msg) {
        System.out.println(tag + "::" + msg);
    }
}

InvertNumber.java: 它将反转传递的数字并使用 Logger

打印日志
public class InvertNumber {

    private Logger logger;

    @Inject
    public InvertNumber(Logger logger) {
        this.logger = logger;
    }

    public void invert(int i) {
        logger.log("Inverted value is " + (i * -1));
    }
}

现在我添加了 Dagger2 依赖项 classes(模块和组件),如下所示

@Module
public class NumberModule {

    private String tag;

    public NumberModule(String tag) {
        this.tag = tag;
    }

    @Provides
    Logger provideLogger(){
        Logger logger = new Logger(tag);
        return logger;
    }

    @Provides
    InvertNumber provideTempManager(Logger logger){
        return new InvertNumber(logger);
    }
}

@Component(modules = NumberModule.class)
public interface NumberComponent {

    InvertNumber getInvertNumber();

}

下面是我的主要方法。

public static void main(String[] args) {

    NumberComponent numberComponent = DaggerNumberComponent.builder()
            .numberModule(new NumberModule("MyMain"))
            .build();

    InvertNumber invertNumber = numberComponent.getInvertNumber();

    invertNumber.invert(10);
}

要在控制台中打印日志,我必须向 logger 提供 tag。为此,我正在创建 NumberModule class 的实例并传递给 NumberComponent 构建器。

现在我的问题是:

  1. 这是使用 NumberModule 实例传递标签的正确方法吗
  2. 如果正确,根据DI理念,不鼓励 使用 new 运算符创建对象 (new NumberModule())
  3. 如果上面的代码有误,正确的做法是什么?

你的解题方法是对的,但是还有一种方法是@Component.Buidler。 (请注意,在您的情况下,Logger 中的 @Inject 注释和 InvertNumber 构造函数不起作用 - 您手动调用它们)。

重写 dagger 类似的东西

@Module
public class NumberModule {
    @Inject
    public NumberModule() {}

    @Provides
    Logger provideLogger(@Named("logger_tag") String tag){
        Logger logger = new Logger(tag);
        return logger;
    }

    @Provides
    InvertNumber provideTempManager(Logger logger){
        return new InvertNumber(logger);
    }
}

@Component(modules = NumberModule.class)
public interface NumberComponent {

    InvertNumber getInvertNumber();

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder loggerTag(@Named("logger_tag") String tag);

        NumberComponent build();
    }
}

并使用它

NumberComponent numberComponent = DaggerNumberComponent.builder()
            .loggerTag("MyMain")
            .build();

为了允许 dagger 为您创建 LoggerInvertNumber(不是手动调用它们的构造函数),您需要为它们中的每一个创建接口。