繁体   English   中英

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

[英]Dagger 2 How to solve constructor dependency

我是一名Android开发人员,正在尝试学习Dagger2 我已经看过一些教程并获得了一些基本的理解。 我使用Dagger2开发了一个基本的Java应用程序。 下面是我的应用代码。

Logger.java:Logger是简单的Java类,它将打印带有某些标签的日志。

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依赖类(模块和组件),如下所示

@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提供标签 为此,我正在创建NumberModule类的实例并将其传递给NumberModule构建器。

现在我的问题是:

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

您解决问题的方法是正确的,但是使用@Component.Buidler还有另一种方法。 (请注意,在这种情况下, LoggerInvertNumber构造函数中的@Inject注释不起作用-您可以手动调用它们)。

像这样重写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 (而不是手动调用它们的构造函数),您需要为它们各自提供接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM