2016-12-26 28 views
1

Ich versuche, Dolch2 zu lernen. Während ich praktizierte, hatte ich eine Frage.Dolch2: Feld Injektion, die auch Injektionsfeld hat

Meine Frage ist Kurz gesagt, ich möchte Feld Injection machen, die auch Feldeinspritzung hat. Wie wird eine Komponente hergestellt oder verwendet?

Ich werde meine Frage unten mit meinem Code erklären. unter Code funktioniert gut, aber ich will besser? oder schöner Code.

Person.java < - diese Klasse hat Feldinjektion.

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); 

} 

Ich lasse Company.java CompanyModule.java, PersonModule.java.

Dies ist ein einfaches Beispiel. aber im größeren Projekt wird es sehr komplex und viele Injektionen darin geben.

In diesem Fall macht Component.java und Call inject() -Methode wie oberen Code wirklich Mühe und schwer zu programmieren. Gibt es eine gute Möglichkeit, schön zu kodieren?

+0

Was genau beschäftigt Sie mit Ihrer Probeninjektion? – Jacob

+1

Was ich will, ist ... Ich möchte component.inject (Person) löschen, die in TestPerson.java ist –

+0

Wenn ich component.inject (person) in TestPerson.java löschen, gäbe es null Wert in person.company. Gibt es eine gute Idee? Wenn ich Wert auf eine Person bei TestPerson.java injiziere, wird das Injektionsfeld (Firma) der Person automatisch injiziert? –

Antwort

0

Sie könnten die Verbindung zwischen beiden Instanzen (Firma und Person) explizit definieren und die benötigte Firma an die Person im Konstruktor der Person übergeben. Der Weg dahin wäre, diese Abhängigkeit in Ihrem PersonModule zu definieren, da Dagger2 Abhängigkeiten in verschiedenen Modulen nachschlagen kann. Dies könnte etwa so aussehen:

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

Auf diese Weise müssen Sie nur Methode einmal für die Person Instanz der Testperson Klasse injizieren nennen.

+0

Vielen Dank für Ihre Antwort. Ich habe eine Frage. Sie meinen, ich sollte Firma Object durch Person Konstruktor übergeben. In diesem Fall, wie Firma in Feld vor Ort injiziert wird, ohne im Konstruktor zuweisen? –

+0

Das Unternehmen wird nicht von der Annotation, sondern von seinem Konstruktor injiziert. Natürlich müssen Sie es im Konstruktor zuweisen. – Jacob

+0

Der Bereich der Abhängigkeitsinjektion mit Anmerkungen ist nur die Klasse, die in der Komponentenmethode definiert ist. Verschachtelte Injektions-Annotationen sind einfach nicht im aktuellen Umfang des Dolches, da dies zu vielen Komplikationen und Fragen führen würde. Für jetzt sollten Sie es nur über den Objektkonstruktor tun. – Jacob

Verwandte Themen