Dagger2 - 应用程序不能依赖于多个作用域内的组件

注意:这个问题可能类似于其他问题,但它提供了一个更好的解释与附件代码,旨在找到问题的解决方案,其他问题中提供的解决方案是不合适的。

就在几天前,我开始开发一个Android模块化应用程序。我使用Dagger 2来处理依赖注入,我目前面临着一个奇怪的行为。我有我的主应用程序模块,以及其他三个模块:

  • Core_Module:它公开第三方库和存储层。

  • Localisation_Module:它公开一个存储库以获取本地化信息。

  • Configuration_Module:它公开一个存储库以获取配置参数。

两者并依赖于 。Configuration_ModuleLocalisation_ModuleCore_Module

核心组件:

@Singleton

@Component(modules = [ApplicationModule::class, NetworkingModule::class, RepositoryModule::class])

interface CoreComponent {

    @Named("retrofit")

    fun retrofit(): Retrofit


    @Named("retrofitWithCache")

    fun retrofitWithCache(): Retrofit


    fun storageRepository(): StorageRepository

}

本地化组件:


@Component(modules = [ServiceModule::class, RepositoryModule::class], dependencies = [CoreComponent::class])

@LocalisationScope

interface LocalisationComponent {

    fun localisationService(): LocalisationService

    fun localisationRepository(): LocalisationRepository

}

配置组件


@Component(modules = [ServiceModule::class, RepositoryModule::class], dependencies = [CoreComponent::class])

@ConfigurationScope

interface ConfigurationComponent {

    fun configurationService(): ConfigurationService

    fun configurationRepository(): ConfigurationRepository

}

应用程序组件


@Component(dependencies = [LocalisationComponent::class, ConfigurationComponent::class])

@ApplicationScope

abstract class ApplicationComponent {

    abstract fun inject(mainActivity: MainActivity)

}

主要应用


class MainApplication : Application() {

    lateinit var applicationComponent: ApplicationComponent


    override fun onCreate() {

        super.onCreate()

        this.registerDependencies()

    }


我决定设计这个架构,因为我想将功能分离成独立的、可互换的模块,以便每个模块都包含执行特定功能并将单个模块导出到其他应用程序所需的一切。

http://img1.mukewang.com/632b14b700016ae603210260.jpg

不幸的是,我收到一个错误,说Dagger组件不允许依赖于多个作用域的组件。有谁知道如何面对这种问题?


四季花海
浏览 85回答 1
1回答

胡子哥哥

经过一整天的麻烦,我找到了适合我的情况的解决方案。所描述的所有模块 (, ) 都需要在我的应用程序模块中使用。Configuration_ModuleLocalisation_Module因此,对于调用,我删除了所有组件依赖项。@ApplicationScope@ModuleApplicationModule应用程序组件@Component(modules = [ApplicationModule::class])@ApplicationScopeabstract class ApplicationComponent {    abstract fun inject(mainActivity: MainActivity)}应用模块@Moduleclass ApplicationModule(private val localisationComponent: LocalisationComponent,                        private val configurationComponent: ConfigurationComponent) {    @Provides    @ApplicationScope    fun providesLocalisationRepository(): LocalisationRepository {        return localisationComponent.localisationRepository() // Provided by Localisation module with Dagger    }    @Provides    @ApplicationScope    fun providesConfigurationRepository(): ConfigurationRepository {        return configurationComponent.configurationRepository() // Provided by Configuration module with Dagger    }}最后是我的主要应用程序class MainApplication : Application() {    lateinit var applicationComponent: ApplicationComponent    override fun onCreate() {        super.onCreate()        this.registerDependencies()    }    private fun registerDependencies() {        val coreModule = CoreModule(applicationContext)        val applicationModule = ApplicationModule(LocalisationModule(coreModule).localisationComponent,                                ConfigurationModule(coreModule).configurationComponent)        applicationComponent = DaggerApplicationComponent.builder()                .applicationModule(applicationModule)                .build()    }}我指出,一切都像一个魅力。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java