2017-08-13 8 views
1

私はアンドロイドの依存性インジェクタとしてDagger2を使用しています。私が直面している問題は、モジュール数がActivityScopeです。 他のプロジェクトと同様に、2種類のモジュールがあります。一度だけ、プロジェクトが展開されるように、各ActivityComponentに含まれている私のApplicationComponent ActivityScopeモジュールをDagger2に一度だけ含めてください

  • ActivityScope S()
  • に私ActivityScopeモジュールの数が増加しているが含まれている

    1. Singleton S(さらに、新しいモジュールが追加されるたびにますます時間が増えています。さらに、ActivityComponentに含まれるモジュールの数は、コードを非常に読みにくくしています。すべてのアクティビティに含まれるモジュールを含める方法を探しています唯一のo nce(まだActivityScopeに入っています)ので、それぞれActivityComponentには明示的なモジュールのみを記述する必要があります。ここで

      は役に立つかもしれません私のコードの一部です:

      もちろん、必ずしもすべての私の

      ApplicationComponent.java

      @Singleton 
      @Component(modules = { 
           ContextModule.class, 
           AppLangModule.class, 
           ... 
           AndroidSupportInjectionModule.class}) 
      public interface ApplicationComponent extends AndroidInjector<MainApplication> { 
      
          @Component.Builder 
          abstract class Builder extends AndroidInjector.Builder<MainApplication> { 
           abstract Builder contextModule(ContextModule contextModule); 
           abstract Builder appLangModule(AppLangModule appLangModule); 
           ... 
          } 
      } 
      

      ApplicationModule.java

      @Module 
      abstract class ApplicationModule { 
          @ActivityScope 
          @ContributesAndroidInjector(modules ={ 
            CategoryRepositoryModule.class, 
            DictionaryRepositoryModule.class, 
            TranslationRepositoryModule.class, 
            StatsRepository.StatsRepositoryModule.class, 
            WordCardRepositoryModule.class, 
            WordCardUserDataRepository.CouchBaseCardRepositoryModule.class, 
            StatsManager.StatsManagerModule.class, 
            WordCardIdProviderFactoryModule.class, 
            CustomSubCategoryRepository.CustomSubCategoryRepositoryModule.class, 
            ConfigurationRepository.ConfigurationRepositoryModule.class}) 
          abstract Activity1 provideActivity1(); 
      
          @ActivityScope 
          @ContributesAndroidInjector(modules ={ 
            CategoryRepositoryModule.class, 
            DictionaryRepositoryModule.class, 
            TranslationRepositoryModule.class, 
            StatsRepository.StatsRepositoryModule.class, 
            WordCardRepositoryModule.class, 
            WordCardUserDataRepository.CouchBaseCardRepositoryModule.class, 
            StatsManager.StatsManagerModule.class, 
            WordCardIdProviderFactoryModule.class, 
            CustomSubCategoryRepository.CustomSubCategoryRepositoryModule.class, 
            ConfigurationRepository.ConfigurationRepositoryModule.class}) 
          abstract Activity2 provideActivity2(); 
          ... 
      } 
      

      アクティビティにはこのような多くのモジュールが必要です(ほとんどのモジュールは他のモジュールs)。

    +0

    あなたはコンストラクタ・インジェクションを使用していますか?これはあなたのモジュール内のすべてのクラスに対して 'new MyClass()'を呼び出すようなものです。 –

    +0

    @DavidMedenjak、はい、いいえ:D、私のコンポーネントはコンストラクタ注入を使用していません。しかし、モジュールはProvideメソッドで作成され(通常の場合)、通常はコンストラクタで依存関係を取る。 –

    +1

    メソッドが_not_コンストラクタインジェクションである。この答えを見てみましょう:https://stackoverflow.com/a/45422229/1837367 –

    答えて

    2

    Module.includesはあなたが単一のモジュールクラスにモジュールを構成することができます。そして、

    @Module(
        includes = { 
         CategoryRepositoryModule.class, 
         DictionaryRepositoryModule.class, 
         TranslationRepositoryModule.class, 
         StatsRepository.StatsRepositoryModule.class, 
         WordCardRepositoryModule.class, 
         WordCardUserDataRepository.CouchBaseCardRepositoryModule.class, 
         StatsManager.StatsManagerModule.class, 
         WordCardIdProviderFactoryModule.class, 
         CustomSubCategoryRepository.CustomSubCategoryRepositoryModule.class, 
         ConfigurationRepository.ConfigurationRepositoryModule.class 
        } 
    ) 
    final class SharedActivityModule {} 
    

    @Module 
    abstract class ApplicationModule { 
        @ActivityScope 
        @ContributesAndroidInjector(modules = { 
         SharedActivityModule.class, 
         /* Activity1 specific modules */, 
        }) 
        abstract Activity1 provideActivity1(); 
    
        @ActivityScope 
        @ContributesAndroidInjector(modules = { 
         SharedActivityModule.class, 
         /* Activity2 specific modules */, 
        }) 
        abstract Activity2 provideActivity2(); 
    } 
    
    関連する問題