2016-07-30 10 views
1

Dagger2は比較的新しくなっていますが、私は自分のプロジェクトでこの利点を使用するのが大好きです。私は現在カスタムスコープを理解しようとしています。Dagger 2とDI、組み込みコンポーネントのサブコンポーネントを置き換えます

私はこの基本的なアプリケーション設定を持っています:ApplicationComponent,ActivityComponentUserComponentです。そして、これは私が私のアプリユーザーがログインしている途中で2つのアクティビティで

    [-----------User scope-------------] 
[ Activity scope ][ Activity scope ][ Activity scope ][ Activity scope ] 
[-----------------------Aplication Scope (Singleton)-------------------] 

で動作するようにそれらを意図する方法である

私の依存関係グラフは次のようになります。AplicationComponent <からActivityComponent <からUserComponent

UserComponentActivityComponentに依存し、ActivityComponentAplicationComponentに依存します。

UserComponentは現在のログインユーザーも提供する「特殊化された」ActivityComponentです。 ユーザーがいらないアクティビティはActivityComponentを使用して注入され、注入する必要があるユーザーはUserComponentを使用する必要があります。それが理にかなってほしい。

ユーザー最初ログには、私は現在の活動にUserComponentを作成します。

ActivtyComponent activityComponent = DaggerActivityComponent.builder() 
     .activityModule(new ActivityModule(this)) //** here, 'this' is the current Activity 
     .applicationComponent(MyApplication.getApp(getActivity()).getAppComponent()) 
     .build(); 

UserComponent userComponent = DaggerUserComponent.builder() 
     .activityComponent(activityComponent) 
     .build(); 

userComponent.inject(this); 

//Store user component to be retrieved by other activities 
MyApplication.getApp(getActivity()).storeUserComponent(userComponent); 

これは正常に動作します。さて、私は新しいアクティビティを開始し、その依存関係を注入しようとします。この時間はずっと簡単です、私はすでにこの理由のために保存されたUserComponentを持っています!私はちょうどそれを使うことができますか?:

MyApplication.getApp(getActivity()).getUserComponent().inject(this); 

間違っています!...それはクラッシュします! (上記のコードを参照してください)

そして、別のUserComponentを作成したくないと、スコープが役に立たなくなります...すべてのメソッドが呼び出されますもう一度、私は正しいですか?

私はその特定のコンポーネントを必要としますが、新しいコンポーネントは必要ありません。しかし、私は何とか新しいもののActivityComponentを交換しなければなりません。新しいものはactivityModuleで渡されます...それは私の質問です:

それは可能ですか?私はこれを正しい方法で見ていますか? 既にビルドされたコンポーネントのサブコンポーネントを変更することはできますか?事前

答えて

1

おかげでほとんどのチュートリアルは、それがAppComponent <- UserComponent <- ActivityComponent

コンポーネントは一度スコープオブジェクトを作成し、何かが変わる場合は、新しいコンポーネントを作成する必要がありますようにあなたがあなたの依存関係を持っているということであることを示す通常の方法。 0123:AをNEW-Aに置き換えてNEW-Aを使用してください。ポイントは...それはです。本当には、あなたが避けたいかもしれない状態を矛盾させています。

コンポーネントはそれぞれのライフサイクルで存続する必要があります。コンポーネントがアクティビティへの参照を保持している場合は、このアクティビティとともに使用する必要があります。そうしないと、メモリリーク(または自分のようなエラー)が発生します。

ユーザーコンポーネントがアプリケーションによって異なる場合は、問題を起こさずにそのコンポーネントをアプリケーション内に格納できます。あなたのアクティビティは、アプリケーションコンポーネントまたはユーザーコンポーネントのいずれかを使用して、それらを使用して独自のスコープ付きコンポーネント—を作成します。

+0

ほとんどのチュートリアルでは、あなたが言及している依存関係の順序を使用していることに気付きました。私はそれを試して、それは動作します! ActivityComponentを作成するたびにUserComponentを提供するだけなので、私はそれが好きではありません。これはすべての活動、たとえ注射するユーザーがいない「ログアウト」活動であっても、これはあまり意味がありません。私が気づいたのは、あなたが言及している依存順序がこの規則に従うということです。ここでは、より短い範囲のスコープはより長いスコープに依存するため、何かが必要です。簡単な説明をお寄せいただきありがとうございます。なぜホットスワッピングコンポーネントが納得できないのかが明らかになった – feresr

+0

@feresrさまざまなアクティビティに異なるコンポーネントを使用できます。いくつかは、ユーザーに依存していますが、他のアプリケーションコンポーネントは –

+0

です。私は人々がそれをするのを見ました。その有効なアプローチ。個人的には、私はコンポーネントをより汎用的/抽象的に保つのが好きです。将来的にもっと多くのアクティビティが必要な場合は、たくさんのコンポーネントで終わりたくありません。私は最初のアプローチに行く:) – feresr

関連する問題