2017-08-13 58 views
1

我在Android中使用Dagger2作爲我的依賴注入器。我面臨的問題是ActivityScope中的模塊數量。 所以像任何其他項目我有兩種類型的模塊。在Dagger2中只包含ActivityScope模塊一次

  1. Singleton S(其中包括只有一次,在我ApplicationComponent
  2. ActivityScope S(其中包括每個ActivityComponent

隨着項目的展開我的ActivityScope模塊的數量都在增加因此每次添加新模塊的時間越來越多,而且每個ActivityComponent包含的模塊數量都使得代碼非常難讀。我正在尋找一種方法來包含所有活動中包含的模塊只有o (仍然在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(); 
}