我正在努力学习Dagger2。 在我练习的时候,我有一个问题。
我的问题是 简而言之,我想做现场注入,其中也有现场注入。 如何制作或使用组件?
我将使用我的代码解释下面的问题。 下面的代码工作正常,但我想要更好?或漂亮的代码。
Person.java < - 此类有字段注入。
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();
}
}
TestPerson.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.java CompanyModule.java,PersonModule.java。
这是一个简单的例子。 但是在更大的项目中,会有非常复杂和多次注射。
在这种情况下,使用Component.java并像上层代码一样调用inject()方法真的很麻烦并且难以编码。 有没有什么好方法来编码漂亮?
答案 0 :(得分:0)
您可以明确定义两个实例(公司和人员)之间的连接,并将所需的公司传递给人员构造函数中的人员。这里的方法是在PersonModule中定义这种依赖关系,因为Dagger2可以在不同的模块中查找依赖关系。这看起来像这样:
@Module
public class PersonModule {
..
@Provides
public Person providePerson(Company company){
return new Person(..,..,company);
}
..
}
这样,您只需要为TestPerson类的Person实例调用一次注入方法。