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

时间:2018-11-14 09:57:10

标签: java android dependency-injection dagger-2 dagger

我是一名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类的实例,并将其传递给NumberComponent构建器。

现在我的问题是:

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

1 个答案:

答案 0 :(得分:0)

您解决问题的方法是正确的,但是使用@Component.Buidler还有另一种方法。 (请注意,在您的情况下,@InjectLogger构造函数中的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(而不是手动调用其构造函数),您需要为它们每个接口。