仅在Dagger2

时间:2017-08-13 08:26:10

标签: android dagger-2 dagger

我在Android中使用Dagger2作为我的依赖注入器。我面临的问题是ActivityScope中的模块数量。 就像任何其他项目一样,我有两种类型的模块。

  1. Singleton s(仅在我的ApplicationComponent
  2. 中包含一次
  3. ActivityScope s(每个ActivityComponent包含哪些内容)
  4. 随着项目的扩展,我的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();
        ...
    }
    

    当然,并非我的所有活动都需要这么多模块(其他模块都需要大多数模块)。

1 个答案:

答案 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