gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:48 24 4
gpt4 key购买 nike

我是一名 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);
}

要在控制台中打印日志,我必须向记录器提供标签。为此,我创建 NumberModule 类的实例并传递给 NumberComponent 构建器。

现在我的问题是:

  1. 这是使用 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(而不是手动调用它们的构造函数),您需要为它们每个提供接口(interface)。

关于java - Dagger 2 如何解决构造函数依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53297397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com