2017-03-23 24 views
1

ダガー2を試していますが、フレームワークを理解するためにテストしています。ダガーコンポーネントの依存関係の意味

@Module 
public class ApplicationModule { 

    private Application appContext; 

    public ApplicationModule(Application appContext) { 
     this.appContext = appContext; 
    } 

    @Provides 
    @Singleton 
    public Context provideContext() { 
     return appContext; 
    } 
} 

は今もNetworkComponentたい:モジュールで

@Component(modules = {ApplicationModule.class}) 
@Singleton 
public interface ApplicationComponent { 
    Context provideContext(); 
} 

私はので、私はこのようにそれを定義し、全アプリのシングルトンにする必要がありApplicationComponentを抱えていますアプリが生存している限り生きている必要があります。 そのネットワークコンポーネントはApplicationComponentに依存する必要があります。 は、だから私は、次のように私のnetworkcomponentを持っている:

@Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class}) 
@PerApp 
public interface NetworkComponent extends ApplicationComponent { 
    @Named(DaggerConstants.DEFAULT_RETROFIT) 
    Retrofit provideDefault(); 

    @Named(DaggerConstants.OTHER_RETROFIT) 
    Retrofit provideOther(); 

    void inject(MainActivity activity); 
} 

モジュール:

1)私は、Androidでのアプリケーションに2つのコンポーネントを格納します。

@Module 
public class NetworkModule { 

    @Named(DaggerConstants.DEFAULT_RETROFIT) 
    @PerApp 
    @Provides 
    Retrofit provideDefaultRetrofit() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://www.someurl.com/") 
       .build(); 

     return retrofit; 
    } 

    @Named(DaggerConstants.OTHER_RETROFIT) 
    @PerApp 
    @Provides 
    Retrofit provideOtherRetrofit() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://www.someotherurl.com/") 
       .build(); 

     return retrofit; 
    } 

    @PerApp 
    @Provides 
    SharedPreferences networkPreferences(Context context) { 
     return context.getSharedPreferences("network", Context.MODE_PRIVATE); 
    } 
} 

私はいくつかの質問を持っています。 しかし私にはAppComponentとNetworkComponentを格納するのが奇妙に思えます。 私のApplicationComponentがNetworkComponentを提供するべきではないのですか?

2)アノテーション@PerAppとstuffは、何かを意味するか、単に@PerAppアノテーションを持つオブジェクトが存在することを見ているDaggerであり、そうでなければそれを削除しますか?これは私には分かりません。

3)@Singletonなどのモジュールをマークすると便利なのですが、これは可能ですが、どの例でも表示されません。

答えて

3

Androidのアプリケーションに2つのコンポーネントを保存します。しかし私には、AppComponentとNetworkComponentを格納するのは奇妙に思えます。私のApplicationComponentがNetworkComponentを提供するべきではないか?

コンポーネントの概念がありません。コンポーネントの背後にある考え方は、オブジェクトの寿命が互いに異なるオブジェクトを持つことです。 例:

  • オブジェクトAは、アプリケーションシングルトンである必要があります。あなたがこのオブジェクトを必要とするときはいつも、それは全く同じオブジェクトになります。
  • オブジェクトBは活動シングルトンでなければなりません。あなたのアクティビティが破壊されて作成されるたびに、新しいオブジェクトが作成されます。
  • オブジェクトCはフラグメントシングルトンである必要があります。フラグメントがアタッチされ、アクティビティに切り離されるたびに、新しいオブジェクトが作成されます。だから、

    ます(それらのそれぞれが依存という名前の適切な提供と仮定。)ComponentA上の依存関係を持っている、あなたはComponentCComponentBの依存関係を持ちたいという、指定

@PerAppとスタッフが行うの注釈それは何かを意味するか、@PerAppアノテーションを持つライブがObjectであることを見ているDaggerです。そうでなければ、それを削除しますか?これは私には分かりません。

カスタムスコープは、生涯にわたって責任を負うオブジェクトに役立ちます。つまり、カスタムスコープを持つコンポーネントを宣言した場合は、そのコンポーネントをクリアする必要があります。次に、コンポーネントから次に依存することを要求されたときに新しいオブジェクトが作成されます。

上記の例では、アクティビティが破棄されるとすぐにComponentBを無効にしなければなりません。そうしないと、次に尋ねるオブジェクトは同じBオブジェクトになります。

@ Singletonなどのモジュールをマークすることは有益ですが、これは可能ですが、どの例でも表示されません。

依存関係の提供に関しては何の違いもありません。しかし、おそらくそれはあなたがホスティングコンポーネントが持っている範囲を覚えておくのに役立ちます。

+0

ありがとうございました。 – user1007522

+1

'YourAwesomeComponent c'を持つ@RautDarpanは、このように' c = null; 'をnullにします。 – azizbekian

関連する問題