Android 在Dagger2中仅包含一次ActivityScope模块
我在android中使用Dagger2作为依赖注入程序。我面临的问题是Android 在Dagger2中仅包含一次ActivityScope模块,android,dagger-2,dagger,Android,Dagger 2,Dagger,我在android中使用Dagger2作为依赖注入程序。我面临的问题是ActivityScope中的模块数量。 所以像其他项目一样,我有两种类型的模块 Singletons(仅包含一次,并且在我的ApplicationComponent ActivityScopes(包含在每个ActivityComponent中) 随着项目的扩展,myActivityScope模块的数量不断增加,因此每次添加新模块的时间越来越长。加上每个ActivityComponent中包含的模块数量使得代码变得非常不可读。
ActivityScope
中的模块数量。
所以像其他项目一样,我有两种类型的模块
Singleton
s(仅包含一次,并且在我的ApplicationComponent
ActivityScope
s(包含在每个ActivityComponent
中)ActivityScope
模块的数量不断增加,因此每次添加新模块的时间越来越长。加上每个ActivityComponent
中包含的模块数量使得代码变得非常不可读。我正在寻找一种方法来包含包含在所有活动中只执行一次ded(仍在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);
...
}
}
@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();
...
}
当然,并非我的所有活动都需要这么多模块(大多数模块是其他模块所需的)。允许您将模块组合到单个模块类中:
@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 {}
那么
您正在使用构造函数注入吗?这看起来非常像您为模块中的每个类调用
new MyClass()
。@DavidMedenjak,是和否:D,我的组件没有使用构造函数注入。但是模块是在它们的提供方法上创建的(如果您是这个意思的话)通常在构造函数中取依赖项。提供的方法不是构造函数注入。看看这个答案:@DavidMedenjak thanx很多,这实际上非常有用。但是这里有一个小问题,这些模块中的大多数都是为接口提供的。是否有必要为@Inject设置默认实现?看看@Binds
将接口绑定到实现。然后,您的模块将只是一个抽象类或接口
@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();
}