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。