gpt4 book ai didi

android - 在 Dagger2 中仅包含一次 ActivityScope 模块

转载 作者:行者123 更新时间:2023-11-29 19:10:09 25 4
gpt4 key购买 nike

我在 android 中使用 Dagger2 作为我的依赖注入(inject)器。我面临的问题是 ActivityScope 中的模块数量。因此,与任何其他项目一样,我有两种类型的模块。

  1. Singleton(仅在我的 ApplicationComponent
  2. 中包含一次
  3. 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com