1
我在Android中使用Dagger2作为我的依赖注入器。我面临的问题是ActivityScope
中的模块数量。 所以像任何其他项目我有两种类型的模块。在Dagger2中只包含ActivityScope模块一次
Singleton
S(其中包括只有一次,在我ApplicationComponent
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)。
是否使用构造器注入?这看起来很像你为模块中的每一个类调用'new MyClass()'。 –
@DavidMedenjak,是和否:D,我的组件不使用构造函数注入。但是这些模块是在它们的Provide方法上创建的(如果这就是你的意思)并且通常在构造函数 –
中具有依赖关系。提供方法是_not_构造函数注入。看看这个答案:https://stackoverflow.com/a/45422229/1837367 –