2017-08-13 35 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(); 
}