简体   繁体   English

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

[英]Dagger 2 How to solve constructor dependency

I am an Android developer and trying to learn Dagger2 . 我是一名Android开发人员,正在尝试学习Dagger2 I have gone through some tutorials and got some basic understanding. 我已经看过一些教程并获得了一些基本的理解。 I developed a basic java app using Dagger2 . 我使用Dagger2开发了一个基本的Java应用程序。 And below is my app code. 下面是我的应用代码。

Logger.java: Logger is simple java class which will print logs with some tag. 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: It will invert the passed number and prints log using Logger 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));
    }
}

Now I added Dagger2 depency classes (Module and component) like below 现在,我添加了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();

}

Now below is my main method. 现在下面是我的主要方法。

public static void main(String[] args) {

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

    InvertNumber invertNumber = numberComponent.getInvertNumber();

    invertNumber.invert(10);
}

To print logs in console, I have to provide tag to the logger . 要在控制台中打印日志,我必须向logger提供标签 For this I am creating instance of NumberModule class and passing to NumberComponent builder. 为此,我正在创建NumberModule类的实例并将其传递给NumberModule构建器。

Now my questions are: 现在我的问题是:

  1. Is this correct way to pass tag using NumberModule instance 这是使用NumberModule实例传递标签的正确方法NumberModule
  2. If it is correct, according to DI concept, it is not encouraged to use new operator to create objects (new NumberModule()) 如果正确,则根据DI概念,不鼓励使用new运算符创建对象(new NumberModule())
  3. If the above code is wrong, what is the correct way? 如果以上代码错误,正确的方法是什么?

Your way of solving problem is right, but there is one more using @Component.Buidler . 您解决问题的方法是正确的,但是使用@Component.Buidler还有另一种方法。 (please, note that in your case @Inject annotation in Logger and InvertNumber constructor not working - you call them by hand). (请注意,在这种情况下, LoggerInvertNumber构造函数中的@Inject注释不起作用-您可以手动调用它们)。

Rewrite dagger stuff like that 像这样重写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();
    }
}

and use it 并使用它

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

To allow dagger create Logger and InvertNumber for you (not manually calling their constructors), you need interfaces for each of them. 为了允许dagger为您创建LoggerInvertNumber (而不是手动调用它们的构造函数),您需要为它们各自提供接口。

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

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