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

标签 android dagger-2 dagger

我在 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/

相关文章:

android - OkHttp 响应缓存不起作用

android - App_HiltComponents.ActivityC 范围为 @dagger.hilt.android.scopes.ActivityScoped 可能不会引用具有不同范围的绑定(bind)

如果没有 @Provides-annotated 方法,就无法提供 android.content.Context

android - 在 Android 上使用 Dagger 2 进行延迟注入(inject)

java - 无法使用 Dagger 2 提供 Activity Context

android - 为什么我在 Firebase 崩溃报告中看不到日志

android - 如何在gradle的build.gradle依赖项中使用 “provided”关键字

Android VideoView 准备失败; OMX-VDEC 报告第二个实例

Android - 运行时 Dagger 注入(inject)

java - 抽象父类(super class)中的通用 @Inject 字段