Кинжал 2 Как решить конструктор зависимости - PullRequest
0 голосов
/ 14 ноября 2018

Я разработчик Android и пытаюсь выучить Dagger2.Я прошел некоторые уроки и получил некоторое базовое понимание.Я разработал базовое Java-приложение, используя Dagger2.Ниже приведен код моего приложения.

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);
}

Чтобы распечатать журналы в консоли, я должен предоставить tag для logger ,Для этого я создаю экземпляр класса NumberModule и передаю его конструктору NumberComponent.

Теперь мои вопросы:

  1. Это правильный способ передачи тега с использованием NumberModule instance
  2. Если это правильно, в соответствии с концепцией DI, не рекомендуется использовать новый оператор для создания объектов (new NumberModule ())
  3. Если приведенный выше код неверен, то как правильно?

1 Ответ

0 голосов
/ 14 ноября 2018

Ваш способ решения проблемы правильный, но есть еще один способ использования @Component.Buidler. (обратите внимание, что в вашем случае @Inject аннотация в Logger и 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 создавать Logger и InvertNumber для вас (без вызова их конструкторов вручную), вам необходимы интерфейсы для каждого из них.

...