Dagger 2 如何解决构造函数依赖
Dagger 2 How to solve constructor dependency
我是一名 Android 开发人员,正在努力学习 Dagger2
。我已经阅读了一些教程并获得了一些基本的了解。我使用 Dagger2
开发了一个基本的 java 应用程序。下面是我的应用程序代码。
Logger.java: Logger 很简单 java class 它将打印带有一些标签的日志。
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
依赖项 classes(模块和组件),如下所示
@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 提供 tag。为此,我正在创建 NumberModule
class 的实例并传递给 NumberComponent 构建器。
现在我的问题是:
- 这是使用
NumberModule
实例传递标签的正确方法吗
- 如果正确,根据DI理念,不鼓励
使用 new 运算符创建对象 (new NumberModule())
- 如果上面的代码有误,正确的做法是什么?
你的解题方法是对的,但是还有一种方法是@Component.Buidler
。 (请注意,在您的情况下,Logger
中的 @Inject
注释和 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
(不是手动调用它们的构造函数),您需要为它们中的每一个创建接口。
我是一名 Android 开发人员,正在努力学习 Dagger2
。我已经阅读了一些教程并获得了一些基本的了解。我使用 Dagger2
开发了一个基本的 java 应用程序。下面是我的应用程序代码。
Logger.java: Logger 很简单 java class 它将打印带有一些标签的日志。
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
依赖项 classes(模块和组件),如下所示
@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 提供 tag。为此,我正在创建 NumberModule
class 的实例并传递给 NumberComponent 构建器。
现在我的问题是:
- 这是使用
NumberModule
实例传递标签的正确方法吗 - 如果正确,根据DI理念,不鼓励 使用 new 运算符创建对象 (new NumberModule())
- 如果上面的代码有误,正确的做法是什么?
你的解题方法是对的,但是还有一种方法是@Component.Buidler
。 (请注意,在您的情况下,Logger
中的 @Inject
注释和 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
(不是手动调用它们的构造函数),您需要为它们中的每一个创建接口。