MVPアーキテクチャのアプリケーションでDIの混乱を少し修正しようとしていて、アプリ内のすべてのアクティビティ関連コンポーネントに対して1つ大きな値を持たないというアイデアを思いつきました - 活性成分。最近私は、ActivityComponent
のそれぞれに別のスコープを宣言することなく、これらのコンポーネントとそのインジェクションを互いに区別するために、引数スコープ(@ActivityScope(ActivityA.class)
など)を使用したSquareプレゼンテーションを見ました。Dagger2を使用したアクティビティグラフ
今、私は難しい問題に直面しています。私は、独自のプレゼンターと場合によっては他のものがあるViewコンポーネントViewAB
があるとします。 ViewAB
とその事柄は、ActivityA
とActivityB
で共有する必要があります。新しいスタイルでは、異なるコンポーネントActivityComponentA
とActivityComponentB
を注入する必要があります。
ViewAB
は現在のところAndroidビューになっていますので、私はいつもその作成を制御できないので、メンバーインジェクションを使用する必要があります。注入に利用できるアクティビティコンポーネントは1つではありませんが、ビューは「アクティビティのような」コンポーネントに存在する必要があるため、コンポーネントとその依存関係をコンポーネントViewABComponent
に移動し、それは「何らかの形で」ActivityComponentA
とActivityComponentB
に依存します。
「どういうわけか」が私の問題です。基本的には、サブコンポーネントとコンポーネントの依存関係には2つの可能性があると思っていました。
私はサブコンポーネントのビルダーが具体的な「親コンポーネント」に依存していると考えていたので、サブコンポーネントを使った試行は成功しませんでしたので、自分のビューのサブコンポーネントを簡単に作成して注入できませんthe builder injection that is described hereを使用)。これは、あなたがそれについて考えるとき、本当に大丈夫です。なぜなら、サブコンポーネントは、親コンポーネントにアタッチされるまで、定義が「完了していない」ためです。しかし、サブコンポーネントは、すべての親コンポーネントをサブコンポーネントに「伝播」するという素晴らしい概念を持っていました。サブコンポーネント内の1つの要素が例えばActivity
の注入を必要とする場合、これは簡単に提供できましたActivityComponentA
またはActivityComponentB
。
次のように、コンポーネントの依存関係が正常に機能するかどうかを確認しました。ここの問題は、実際にはすべてが大きく切り離されており、実際には別々のグラフを扱うことです。 ActivityComponentA
とActivityComponentB
に依存することはViewABComponent
ではありませんが、ViewABComponent
自体が何かActivityComponentA
とActivityComponentB
に依存している場合、つまり簡単なActivity
インスタンスですか?
どうすればこのような問題を解決できますか?どういうわけか、サブコンポーネントの移動と実際の依存関係のために移動します。あなたのベストプラクティスは何ですか?
私は同意しません。 _定期的に多くのものが注入されます。つまり、あなたは「ActivityA」でそれを自分で行いました。確かに、私は "外部"からの意見を注入することができましたが、これはビュー内の注入されたものの利用可能性を完全に予測不可能にするでしょう。私が通常やっていることは、 'Activity'が実装しなければならない軽量な' interface ComponentCallback'と、ビューが物事を注入するのに必要なコンポーネントを取得するために使用できることです。もちろん、このコンポーネントは1つのコンポーネントだけが存在する場合に最適です。 –
@ThomasKeller依存関係の注入は、依存関係を宣言してからそれらを取得することです。インターフェイスを宣言した場合は、実装がほしいだけで、どちらを知る必要はありません。あなたの意見は同じです。実装Aか実装Bのどちらが問題になるかは関係ありません。そうであれば、スコープと依存性はまったく異なります。外部のアクティビティは、どのコンポーネントを作成して初期化するかを知っており、コンポーネントは依存関係をどのように提供するかを知っています。これは私のサンプルが示すものです。 –