Android 在Dagger2中仅包含一次ActivityScope模块

Android 在Dagger2中仅包含一次ActivityScope模块,android,dagger-2,dagger,Android,Dagger 2,Dagger,我在android中使用Dagger2作为依赖注入程序。我面临的问题是ActivityScope中的模块数量。 所以像其他项目一样,我有两种类型的模块 Singletons(仅包含一次,并且在我的ApplicationComponent ActivityScopes(包含在每个ActivityComponent中) 随着项目的扩展,myActivityScope模块的数量不断增加,因此每次添加新模块的时间越来越长。加上每个ActivityComponent中包含的模块数量使得代码变得非常不可读。

我在android中使用Dagger2作为依赖注入程序。我面临的问题是
ActivityScope
中的模块数量。 所以像其他项目一样,我有两种类型的模块

  • Singleton
    s(仅包含一次,并且在我的
    ApplicationComponent
  • ActivityScope
    s(包含在每个
    ActivityComponent
    中)
  • 随着项目的扩展,my
    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();
    }