2016-05-25 5 views
3

MVPアーキテクチャのアプリケーションでDIの混乱を少し修正しようとしていて、アプリ内のすべてのアクティビティ関連コンポーネントに対して1つ大きな値を持たないというアイデアを思いつきました - 活性成分。最近私は、ActivityComponentのそれぞれに別のスコープを宣言することなく、これらのコンポーネントとそのインジェクションを互いに区別するために、引数スコープ(@ActivityScope(ActivityA.class)など)を使用したSquareプレゼンテーションを見ました。Dagger2を使用したアクティビティグラフ

今、私は難しい問題に直面しています。私は、独自のプレゼンターと場合によっては他のものがあるViewコンポーネントViewABがあるとします。 ViewABとその事柄は、ActivityAActivityBで共有する必要があります。新しいスタイルでは、異なるコンポーネントActivityComponentAActivityComponentBを注入する必要があります。

ViewABは現在のところAndroidビューになっていますので、私はいつもその作成を制御できないので、メンバーインジェクションを使用する必要があります。注入に利用できるアクティビティコンポーネントは1つではありませんが、ビューは「アクティビティのような」コンポーネントに存在する必要があるため、コンポーネントとその依存関係をコンポーネントViewABComponentに移動し、それは「何らかの形で」ActivityComponentAActivityComponentBに依存します。

「どういうわけか」が私の問題です。基本的には、サブコンポーネントとコンポーネントの依存関係には2つの可能性があると思っていました。

私はサブコンポーネントのビルダーが具体的な「親コンポーネント」に依存していると考えていたので、サブコンポーネントを使った試行は成功しませんでしたので、自分のビューのサブコンポーネントを簡単に作成して注入できませんthe builder injection that is described hereを使用)。これは、あなたがそれについて考えるとき、本当に大丈夫です。なぜなら、サブコンポーネントは、親コンポーネントにアタッチされるまで、定義が「完了していない」ためです。しかし、サブコンポーネントは、すべての親コンポーネントをサブコンポーネントに「伝播」するという素晴らしい概念を持っていました。サブコンポーネント内の1つの要素が例えばActivityの注入を必要とする場合、これは簡単に提供できましたActivityComponentAまたはActivityComponentB

次のように、コンポーネントの依存関係が正常に機能するかどうかを確認しました。ここの問題は、実際にはすべてが大きく切り離されており、実際には別々のグラフを扱うことです。 ActivityComponentAActivityComponentBに依存することはViewABComponentではありませんが、ViewABComponent自体が何かActivityComponentAActivityComponentBに依存している場合、つまり簡単なActivityインスタンスですか?

どうすればこのような問題を解決できますか?どういうわけか、サブコンポーネントの移動と実際の依存関係のために移動します。あなたのベストプラクティスは何ですか?

答えて

0

ビューはアクティビティの一部であるため、アクティビティスコープ(およびコンポーネント)内にも存在する必要があります。したがって、独自のコンポーネント(コンポーネントの依存関係、または一部のSubComponent)を持っていると、実際にはきれいに見えません。

あなたはビューを一度ActivityAComponentの従属関係で注入しなければならず、一度ActivityBComponentから一度だけあなたのビューを注入する必要があります...なぜあなたはそれをしないのですか?

これらのコンポーネントは、発表者が使用するを知っています。彼らはあなたのビューを注入する方法を知っている

class ActivityA { 
    onCreate() { 
     ActivityAComponent component = create(); 

     component.inject(this); // inject activity 
     component.inject(findViewById(R.id.myComplexView); // inject the view 
    } 
} 

オブジェクトが決しては自分自身を注入しなければなりません。アクティビティで注入を処理させる場合は、必要な依存関係を提供するだけで済みます。

+0

私は同意しません。 _定期的に多くのものが注入されます。つまり、あなたは「ActivityA」でそれを自分で行いました。確かに、私は "外部"からの意見を注入することができましたが、これはビュー内の注入されたものの利用可能性を完全に予測不可能にするでしょう。私が通常やっていることは、 'Activity'が実装しなければならない軽量な' interface ComponentCallback'と、ビューが物事を注入するのに必要なコンポーネントを取得するために使用できることです。もちろん、このコンポーネントは1つのコンポーネントだけが存在する場合に最適です。 –

+0

@ThomasKeller依存関係の注入は、依存関係を宣言してからそれらを取得することです。インターフェイスを宣言した場合は、実装がほしいだけで、どちらを知る必要はありません。あなたの意見は同じです。実装Aか実装Bのどちらが問題になるかは関係ありません。そうであれば、スコープと依存性はまったく異なります。外部のアクティビティは、どのコンポーネントを作成して初期化するかを知っており、コンポーネントは依存関係をどのように提供するかを知っています。これは私のサンプルが示すものです。 –

関連する問題