[英]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: 现在我的问题是:
NumberModule
instance NumberModule
实例传递标签的正确方法NumberModule
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). (请注意,在这种情况下,
Logger
和InvertNumber
构造函数中的@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
为您创建Logger
和InvertNumber
(而不是手动调用它们的构造函数),您需要为它们各自提供接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.