Dagger2:现场注射,其中也有注射场

时间:2016-12-26 08:36:07

标签: java dependency-injection field dagger-2

我正在努力学习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()方法真的很麻烦并且难以编码。 有没有什么好方法来编码漂亮?

1 个答案:

答案 0 :(得分:0)

您可以明确定义两个实例(公司和人员)之间的连接,并将所需的公司传递给人员构造函数中的人员。这里的方法是在PersonModule中定义这种依赖关系,因为Dagger2可以在不同的模块中查找依赖关系。这看起来像这样:

@Module
public class PersonModule {
..
@Provides
public Person providePerson(Company company){
  return new Person(..,..,company);
}
..
}

这样,您只需要为TestPerson类的Person实例调用一次注入方法。