2016-12-26 3 views
1

Я пытаюсь изучить Dagger2. Пока я занимался, у меня был вопрос.Dagger2: Field Injection, у которого также есть поле инжекции

Мой вопрос Короче говоря, я хочу сделать поле Инъекции, в котором также есть инъекция поля. Как сделать или использовать компонент?

Я объясню свой вопрос ниже моим кодом. ниже код работает нормально, но я хочу лучше? или красивый код.

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 и call inject(), такой как верхний код, действительно беспокоит и трудно кодирует. Есть ли хороший способ красивого кода?

+0

Что именно вас беспокоит при введении образца? – Jacob

+1

Что я хочу ... Я хочу удалить компонент. Инъект (человек), который находится в TestPerson.java –

+0

Если я удалю компонент component.inject (person) в TestPerson.java, в person.company будет пустое значение. Есть ли хорошая идея? когда я ввожу значение человеку в TestPerson.java, поле инъекции человека (компания) вводится автоматически? –

ответ

0

Вы можете явно определить связь между обоими экземплярами (Company and Person) и передать необходимую компанию лицу внутри конструктора человека. Путь сюда будет заключаться в определении этой зависимости внутри вашего PersonModule, поскольку Dagger2 может искать зависимости в разных модулях. Это может выглядеть примерно так:

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

Этот путь вам нужно только позвонить впрыснуть метод один раз для экземпляра Person класса TestPerson.

+0

Благодарим вас за ответ. У меня есть вопрос. Вы имеете в виду, что я должен передать объект Company через конструктор Person. В этом случае, как компания вводится в поле лично, без назначения в конструкторе? –

+0

Компания не будет вводиться аннотацией, а вместо этого ее конструктором. Конечно, вам нужно назначить его в конструкторе. – Jacob

+0

Объем инъекции зависимостей с аннотациями - это только класс, который определен в методе компонентов. Аннотации вложенных инъекций просто не входят в текущую область кинжала, так как это вызовет множество осложнений и вопросов. Пока вы должны просто сделать это через конструктор объектов. – Jacob

Смежные вопросы