我在 android 中使用 Dagger2 作为我的依赖注入(inject)器。我面临的问题是 ActivityScope
中的模块数量。
因此,与任何其他项目一样,我有两种类型的模块。
Singleton
(仅在我的ApplicationComponent
中包含一次
ActivityScope
(包含在每个ActivityComponent
中)
随着项目的扩展,我的 ActivityScope
模块的数量也在增加,因此每次添加新模块时它的时间越来越多。加上每个 ActivityComponent
中包含的模块数量使得代码非常难读。我正在寻找一种方法来包含所有 Activity 中仅包含一次的模块(仍在 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();
...
}
当然,并不是我所有的 Activity 都需要这么多模块(其他模块需要大部分模块)。
最佳答案
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();
}
关于android - 在 Dagger2 中仅包含一次 ActivityScope 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45658487/