簡體   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