Dagger2は比較的新しくなっていますが、私は自分のプロジェクトでこの利点を使用するのが大好きです。私は現在カスタムスコープを理解しようとしています。Dagger 2とDI、組み込みコンポーネントのサブコンポーネントを置き換えます
私はこの基本的なアプリケーション設定を持っています:ApplicationComponent
,ActivityComponent
、UserComponent
です。そして、これは私が私のアプリユーザーがログインしている途中で2つのアクティビティで
[-----------User scope-------------]
[ Activity scope ][ Activity scope ][ Activity scope ][ Activity scope ]
[-----------------------Aplication Scope (Singleton)-------------------]
で動作するようにそれらを意図する方法である
私の依存関係グラフは次のようになります。AplicationComponent
<からActivityComponent
<からUserComponent
UserComponent
はActivityComponent
に依存し、ActivityComponent
はAplicationComponent
に依存します。
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で渡されます...それは私の質問です:
それは可能ですか?私はこれを正しい方法で見ていますか? 既にビルドされたコンポーネントのサブコンポーネントを変更することはできますか?事前
ほとんどのチュートリアルでは、あなたが言及している依存関係の順序を使用していることに気付きました。私はそれを試して、それは動作します! ActivityComponentを作成するたびにUserComponentを提供するだけなので、私はそれが好きではありません。これはすべての活動、たとえ注射するユーザーがいない「ログアウト」活動であっても、これはあまり意味がありません。私が気づいたのは、あなたが言及している依存順序がこの規則に従うということです。ここでは、より短い範囲のスコープはより長いスコープに依存するため、何かが必要です。簡単な説明をお寄せいただきありがとうございます。なぜホットスワッピングコンポーネントが納得できないのかが明らかになった – feresr
@feresrさまざまなアクティビティに異なるコンポーネントを使用できます。いくつかは、ユーザーに依存していますが、他のアプリケーションコンポーネントは –
です。私は人々がそれをするのを見ました。その有効なアプローチ。個人的には、私はコンポーネントをより汎用的/抽象的に保つのが好きです。将来的にもっと多くのアクティビティが必要な場合は、たくさんのコンポーネントで終わりたくありません。私は最初のアプローチに行く:) – feresr