2017-02-10 7 views
1

Dagger2ではスコープごとに1つのインスタンスしか持たないようにしています。Dagger2でスコープごとにインスタンスを1つだけ確保する

デフォルトのシングルトンスコープは、すでにそのように動作しています。同じオブジェクトをいくつ注入するかは関係ありませんが、GlobalInstanceと呼びましょう。GlobalInstance provideGlobalInstance()というメソッドは、一度だけ呼び出されます。他の側では

私はカスタムスコープを定義した場合、例えば@SessionScopeといくつかのSessionModule内部のために私はUserを注入していた方法User provideUser()、そのメソッド(および、結果的に、new User()コンストラクタは)何回も呼び出されますします。毎回同じモジュールインスタンスを使用するかどうかにかかわらず、@Inject User mUserごとにUser provideUser()が呼び出されています。これはスコープ制限の「シングルトン」ではなく、複数のインスタンスが作成されているためです。

通常のDagger APIを使用して、これを達成するための明確な方法がありますか。これを行う1つの方法は、モジュールクラスの中に怠惰なgetterを持たせることですが、それを行うにはあまりクリーンな方法ではありません。

+0

あなたは[OK]を指定したコンポーネント – EpicPandaForce

+0

に属しているインスタンスを注入することを確実にするために同じコンポーネントを使用する必要があり、そうではなく、モジュールを永続化するので、私は存続すべきですどうにか全体のコンポーネント、右か?それを行うベストプラクティスは何ですか?いくつかの静的/グローバルコンポーネントキャッシュ? – SadClown

+0

はい、通常ははいです。アプリケーションレベルの@Singletonスコープでは 'static'、アクティビティでは' onRetainCustomNonConfigurationInstance() 'を見てきました。マップ内の何らかのキーにコンポーネントを格納している場合は、「Map 」と書かれています – EpicPandaForce

答えて

1

@Singletonスコープは、機能的に定義した他のカスタムスコープと同等です。

それはあなたがSessionModule@Provides方法の2種類を持っている可能性があることを意味:

  • @Provides @SessionsScope - 「セッションシングルトン」(この後でより)
  • @Providesを提供 - 各注入
  • に新しいオブジェクトを提供します

私たちがダガーについて話すとき、「シングルトン」という用語には多少の曖昧さがありますので、「スコープ付きオブジェクト」という用語を使用することをお勧めします。最初にDaggerを注入されたスコープ付きオブジェクトの場合、コンポーネントはそのインスタンスをキャッシュし、その後同じコンポーネントで実行されるたびにそれを返します。あなたがこの記事を読むことができます詳細については

Android Dagger 2 Scopes Demistified

+0

私はカスタムスコープが提供されたシングルトンと異なるわけではありませんが、違う振る舞いをしています。 EpicPandaForceがコメントで説明した問題だと思われます。スコープごとに複数回呼び出される*()メソッドを提供したくない場合、同じモジュールを使用するのではなく、コンポーネント全体を使用するべきです。 – SadClown

+0

@SadClown、私が参照したブログ記事を読んでください - それはこれらの関係を詳細に説明しています。 githubには、コンポーネントを扱うためのアプローチの1つを示すチュートリアルアプリもあります。 – Vasiliy

+0

申し訳ありませんが、私は無礼に見えますが、私は谷に行って私の答えを見つけられませんでした。しかし私はあなたとEpicPandaForceの答えを組み合わせて、私の問題を解決しました。ありがとう。 – SadClown

関連する問題