2016-12-26 19 views
1

Dagger2を学ぼうとしています。 私が練習している間、私は質問がありました。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

正確にサンプルを注入するのはどうですか? – Jacob

+1

私がしたいことは... TestPerson.javaにあるcomponent.inject(人物)を消去したい –

+0

TestPerson.javaでcomponent.inject(person)を消去すると、person.companyにnull値があります。 良いアイデアはありますか? TestPerson.javaの人に価値を注入すると、人の注入フィールド(会社)が自動的に注入されますか? –

答えて

0

両方のインスタンス(CompanyとPerson)の間の接続を明示的に定義し、必要な会社を人のコンストラクタ内の人に渡すことができます。 Dagger2はさまざまなモジュール全体の依存関係を調べることができるため、PersonModule内でこの依存関係を定義する方法があります。

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

このようにすれば、TestPersonクラスのPersonインスタンスに対して一度injectメソッドを呼び出すだけで済みます。

+0

ありがとうございます。質問があります。 私は会社オブジェクトをPersonのコンストラクタで渡す必要があることを意味します。 その場合、コンストラクタで代入することなく、どのようにして会社を人で直接フィールドに注入するのですか? –

+0

会社は注釈ではなく、そのコンストラクタによって挿入されます。もちろん、それをコンストラクタに代入する必要があります。 – Jacob

+0

アノテーションによる依存性注入のスコープは、コンポーネントメソッドで定義されているクラスのみです。ネストされた注入注釈は、現在の短剣の範囲にはありません。これは、多くの合併症や疑問を引き起こすからです。今のところ、オブジェクトコンストラクタを使用して行う必要があります。 – Jacob