2016-07-24 5 views
1

私はこのプロジェクトを見るまで、Dagger 2で依存性注入がどのように機能するかを理解していました。Dagger 2この例のコンストラクタインジェクション

public class CharacterDetailPresenter implements Presenter { 

private final CharacterDetailsUsecase mGetCharacterInformationUsecase; 

@Inject 
public CharacterDetailPresenter(CharacterDetailsUsecase getCharacterInformationUsecase) { 
    mGetCharacterInformationUsecase = getCharacterInformationUsecase; 
} 
} 
//presenter methods 

プレゼンターが注入されたアクティビティ:

public class CharacterDetailActivity extends AppCompatActivity implements CharacterDetailView { 

    @Inject CharacterDetailPresenter mCharacterDetailPresenter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    initializeDepedencyInjector(); 
    // 
} 

    private void initializeDependencyInjector() { 

    AvengersApplication avengersApplication = (AvengersApplication) getApplication(); 

    int avengerId = getIntent().getIntExtra(EXTRA_CHARACTER_ID, -1); 

    DaggerAvengerInformationComponent.builder() 
     .activityModule(new ActivityModule(this)) 
     .appComponent(avengersApplication.getAppComponent()) 
     .avengerInformationModule(new AvengerInformationModule(avengerId)) 
     .build().inject(this); 
    } 
// 
} 

、問題のモジュール。

他のモジュールに含まれていないときに、プレゼンターがどのようにアクティビティに注入されるのか分かりません。私が得意でないコンストラクタの注射について何かありますか?だから、

答えて

0

...

CDActivity <- CDPresenter <- CDUsecase <- [...] 

私はあなたがそれがモジュールによって作成されているので、UseCase建設をたどることができたと思います。したがって、その依存関係を無視すると、上記の—というグラフが単純に—であることがわかります。

アクティビティにはプレゼンターが必要です。プレゼンターは、使用例に応じて異なります。

私には得られないコンストラクタインジェクションについては何かありますか?

正確に。プレゼンターは、コンストラクタ・インジェクションを使用しています:

@Inject 
public CharacterDetailPresenter(CharacterDetailsUsecase getCharacterInformationUsecase) { 
    mGetCharacterInformationUsecase = getCharacterInformationUsecase; 
} 

@Inject注釈付きのコンストラクタを参照してください?あなたはコンストラクタに注釈をつけて、短剣がそれを見ることができるでしょう。オブジェクトのすべての依存関係(コンストラクタパラメータ)をコンポーネントから提供できる場合、コンポーネントはこの場合はオブジェクト—をプレゼンタにも提供できます。

アクティビティコンポーネントはUseCase(モジュールによって提供されます)を含み、Presenter(注釈付きコンストラクタ)を認識し、プレゼンタを提供できます。アクティビティはプレゼンターに要求します...そして、短剣は単にそれを渡します。

ダガーは生成コードですが、試して、生成されたソースファイルを見てみましょう!多分、ダガーがフードの下で何をするのか見てみよう!

私の謙虚な意見では、依存性注入についての最も強力なことであり、コード行の手書きを保存するので、コンストラクタインジェクションを本当に理解してください。

私はまた、dagger basicsの概要を説明する記事を書いています。プレゼンタがスコープ外であり、すべての注射のために再作成されるので


このコードは、実際には多少の誤差傾向があります。できるだけ— —あなたのオブジェクトをスコープする必要があります。あなたはコンストラクタ・インジェクションを使用する場合は、クラス自体に注釈を付けます:

@Activity public class CharacterDetailPresenter implements Presenter { /* */ } 
+0

最初はそれは私がダガーは明らかにそれを綴るためのプレゼンターが、感謝を作成することを考えたものです。私は間違いなく、将来、生成されたコードを見ていきます。 – hakuteru

+0

あなたのブログには、コンストラクタインジェクションを行う方法の例は示されていません。私はコンストラクタの注入を試みましたが、動作しませんでした。どうぞご覧くださいhttps://stackoverflow.com/q/45192878/5214893 –

+1

@eCDroid仕事を見ています。私は本当にあなたのプロジェクトでそれを使用しようとする前にDaggerをつかんでみることをお勧めします。単一のファイルを開き、パッケージのローカルコンポーネント、モジュール、クラス(依存関係の有無にかかわらず)を宣言し、コンパイルを続けます。このようにDaggerでできることとできないことをすぐに理解できます。 DaggerがConstructor Injectionのコンストラクタを呼び出すとき、およびフィールド注入を行うためにコンポーネントに 'inject(MyClass)'メソッドを登録する必要があるときは、必ず確認してください。 –

関連する問題