Dagger2:Field Injection,其中也有注入场
Dagger2 : Field Injection which also has injection field in it
我正在努力学习 Dagger2。
在练习的过程中,我有一个疑问。
我的问题是
简而言之,我想进行场注入,其中也有场注入。
如何制作或使用组件?
我将在下面用我的代码解释我的问题。
下面的代码工作正常,但我想要更好的?或漂亮的代码。
Person.java <- 这个 class 有字段注入。
public class Person {
public String name;
public int age;
@Inject
public Company involvedCompany; // Look here!! has field Injection.
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return "[User] name : " + name + ", age : " + age + ", Company : " + involvedCompany.toString();
}
}
测试Person.java
public class TestPerson {
@Inject
Person person; //I want to do field injection to this field.
//this filed also contains field injection in it.
//(See previos code Person.java)
TestPersonComponent component;
private TestPerson(){
component = DaggerTestPersonComponent.builder()
.companyModule(new CompanyModule("Tmax", "Korea"))
.personModule(new PersonModule("Ui-Gyun", 28))
.build();
/****************************************************
HERE!!! I am wondering How to change under code!!
*****************************************************/
component.inject(this); // for this class.
component.inject(person); // for person's inside field.
}
public void call(){
System.out.println(person.toString());
}
public static void main(String[] args){
TestPerson test = new TestPerson();
test.call();
}
}
TestPersonComponent.java
@Component(modules={CompanyModule.class, PersonModule.class})
public interface TestPersonComponent {
void inject(TestPerson test);
void inject(Person person);
}
我省略了Company.javaCompanyModule.java,PersonModule.java.
这是一个简单的例子。
但是在更大的项目中,会有非常复杂和大量的注入。
在那种情况下,像上面的代码那样制作 Component.java 并调用 inject() 方法真的很麻烦,而且很难编码。
有什么好的方法可以让代码漂亮?
您可以显式定义两个实例(公司和个人)之间的连接,并将所需的公司传递给个人构造函数中的个人。去这里的方法是在你的 PersonModule 中定义这个依赖关系,因为 Dagger2 可以在不同的模块中查找依赖关系。这可能看起来像这样:
@Module
public class PersonModule {
..
@Provides
public Person providePerson(Company company){
return new Person(..,..,company);
}
..
}
这样你只需要为 TestPerson 的 Person 实例调用一次注入方法 class。
我正在努力学习 Dagger2。 在练习的过程中,我有一个疑问。
我的问题是 简而言之,我想进行场注入,其中也有场注入。 如何制作或使用组件?
我将在下面用我的代码解释我的问题。 下面的代码工作正常,但我想要更好的?或漂亮的代码。
Person.java <- 这个 class 有字段注入。
public class Person {
public String name;
public int age;
@Inject
public Company involvedCompany; // Look here!! has field Injection.
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return "[User] name : " + name + ", age : " + age + ", Company : " + involvedCompany.toString();
}
}
测试Person.java
public class TestPerson {
@Inject
Person person; //I want to do field injection to this field.
//this filed also contains field injection in it.
//(See previos code Person.java)
TestPersonComponent component;
private TestPerson(){
component = DaggerTestPersonComponent.builder()
.companyModule(new CompanyModule("Tmax", "Korea"))
.personModule(new PersonModule("Ui-Gyun", 28))
.build();
/****************************************************
HERE!!! I am wondering How to change under code!!
*****************************************************/
component.inject(this); // for this class.
component.inject(person); // for person's inside field.
}
public void call(){
System.out.println(person.toString());
}
public static void main(String[] args){
TestPerson test = new TestPerson();
test.call();
}
}
TestPersonComponent.java
@Component(modules={CompanyModule.class, PersonModule.class})
public interface TestPersonComponent {
void inject(TestPerson test);
void inject(Person person);
}
我省略了Company.javaCompanyModule.java,PersonModule.java.
这是一个简单的例子。 但是在更大的项目中,会有非常复杂和大量的注入。
在那种情况下,像上面的代码那样制作 Component.java 并调用 inject() 方法真的很麻烦,而且很难编码。 有什么好的方法可以让代码漂亮?
您可以显式定义两个实例(公司和个人)之间的连接,并将所需的公司传递给个人构造函数中的个人。去这里的方法是在你的 PersonModule 中定义这个依赖关系,因为 Dagger2 可以在不同的模块中查找依赖关系。这可能看起来像这样:
@Module
public class PersonModule {
..
@Provides
public Person providePerson(Company company){
return new Person(..,..,company);
}
..
}
这样你只需要为 TestPerson 的 Person 实例调用一次注入方法 class。