我在Android中使用Dagger2作为我的依赖注入器。我面临的问题是ActivityScope
中的模块数量。
就像任何其他项目一样,我有两种类型的模块。
Singleton
s(仅在我的ApplicationComponent
ActivityScope
s(每个ActivityComponent
包含哪些内容)随着项目的扩展,我的ActivityScope
模块的数量正在增加,因此每次添加新模块时,它的时间会越来越多。此外,每个ActivityComponent
中包含的模块数量使得代码非常难以理解。我正在寻找一种方法来包含仅包含在所有活动中的模块一次(仍然在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();
...
}
当然,并非我的所有活动都需要这么多模块(其他模块都需要大多数模块)。
答案 0 :(得分:2)
Module.includes
允许您将模块组合成单个模块类:
@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();
}
然后,
SELECT
ROUND (
(
CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", ""))
)
/ CHAR_LENGTH(" ")
) AS count
FROM documents