我是dagger。
@Module
public class MyModule {
@Provides
Student provideStudent(String name) {
return new Student(name);
}
}
注射学生时如何通过参数name
?@Inject Student student
?但是我在哪里/如何通过?
name
您想将对象(String name
)作为参数提供给组件的参数,以便其他部件可以使用它。您基本上有2个选择。
模块构造函数参数
使用模块参数是您在引入Component.Builder
之前将使用的"经典"方法。
您要做的就是将所需的内容添加到模块构造函数,然后从模块提供。
@Module
public class MyModule {
private String name;
MyModule(String name) {
this.name = name;
}
// -----------------------------------------------
// you could obviously just use the field directly
@Provides
Student provideStudent() {
return new Student(name);
}
// ---------------------------------------------------------------------
// alternatively you'd add a Qualifier and add the argument to the graph
@Provides
@Named("name")
String provideName() {
return name;
}
// then you can use it...
@Provides
Student provideStudent(@Named("name") String name) {
return new Student(name);
}
}
直接使用该名称的第一个选项意味着仅在中可用模块。如果要使用构造函数注入或使用合格的字符串,则必须将其添加到图表中,如下所示。
使用两种方法,您必须手动将模块添加到组件中,因为该模块不再使用默认构造函数。这是您现在还提供论点的地方。
DaggerMyComponent.builder()
.myModule(new MyModule("some name"))
.build();
组件构建器
相同的概念,但另一种方法是使用组件构建器来实现相同的东西绑定到图形。
@Component(modules = MyModule.class)
interface MyComponent {
@Component.Builder
interface Builder {
@BindsInstance Builder name(@Named("name") String name);
MyComponent build();
}
}
@Module
class MyModule {
@Provides
Student provideStudent(@Named("name") String name) {
return new Student(name);
}
}
在这里,您也只需在可以使用的图表中添加一个对象即可。在这里,您也必须将其添加到组件构建器
DaggerMyComponent.builder()
.name("some name")
.build();
我的问题是如何将学生实例注入一个名称 硬编码。
name
是 Student
的依赖性,并且解决了这种依赖性。为此,您需要一个注释的@Provid
E方法,该方法返回该String
。由于类型通常是由返回类型推断的,因此,如果String
,您还必须使用注释@Named
@Provides
@Named("Name")
public String provideName() {
return "My name";
}
并更改您的方法
@Provides
Student provideStudent(@Named("Name") String name) {
return new Student(name);
}
这样的方式,dagger2知道ho以解决 String
构建 Student
而不是直接注入Student
,可以创建Student
工厂并注入它:
public class Student {
public Student(String name, Knowledge knowledge) {}
public static class Factory {
private Knowledge knowledge;
@Inject
public Factory(Knowledge knowledge) {
this.knowledge = knownledge;
}
public Student create(String name) {
return new Student(name, knowledge);
}
}
}
或Kotlin中的相同代码:
class Student(name: String, knowledge: Knowledge) {
class Factory @Inject constructor(private val knowledge: Knowledge) {
fun create(name: String) = Student(name, knowledge)
}
}
这允许在Student
实例化上传递name
参数,因此:
public class MyClass {
@Inject
public Student.Factory studentFactory;
private Student student;
public void setupStudent() {
this.student = studentFactory.create("Student's name");
}
}