是否有可能使dagger应用程序组件无效并在android中创建一个新的dagger应用程序组件

问题描述

我具有一项功能,需要为不同的用户提供不同的会议室数据库。 我正在使用Dagger 2创建房间数据库。我的应用程序组件创建一个房间数据库。当用户切换到另一个用户时,我想为其创建新的会议室数据库,我需要创建新的应用程序组件。我能够做到,但是旧的仍然存在。如何销毁旧的应用程序组件并创建新的应用程序组件。

我正在Application类中定义Application Component,如下所示:

var daggerComponent: ApplicationComponent? = null
 daggerComponent = DaggerApplicationComponent.builder().application(this).build()
 ApplicationInjector.init(this) { application ->
 daggerComponent?.inject(application)
}

切换用户时,我正在尝试这样做:

val appComponent = DaggerApplicationComponent.builder().application(application = application).build()
ApplicationInjector.init(propertyManagerApplication) { application ->
appComponent?.inject(application)
}

如何完全销毁旧组件,然后创建一个新组件,以便在某个时间点仅存在一个组件

解决方法

我认为您是从错误的角度来解决这个问题。

您应该将Room数据库放在与ApplicationComponent不同的范围内。然后,您可以随时轻松地重建此组件,并且将严格分离与User会话相关的所有依赖关系。


例如(写下我的头顶,所以测试)

  1. 创建自定义Scope
@Scope
@Retention(value = AnnotationRetention.RUNTIME)
annotation class UserSessionScope
  1. 创建一个Subcomponent(使用创建的Scope):
@UserSessionScope
@Subcomponent
interface UserSessionComponent {

    @Subcomponent.Factory
    interface Factory {
        fun create(): UserSessionComponent
    }

    // INITIALIZE YOUR ROOM DATABASE
    // AND ALL DEPENDENCIES THAT DEPEND ON THE ROOM DATABASE

    // inject functions,etc.
}
  1. 一个用于通知Dagger子组件的新模块:
@Module(subcomponents = UserSessionComponent::class)
class SubcomponentsModule {}
  1. 在您的ApplicationComponent中:
@Singleton
@Component(modules = [SubcomponentsModule::class])
interface ApplicationComponent {
    
    fun userSessionComponent(): UserSessionComponent.Factory
 
}
  1. 只要维持用户会话(不切换用户),就可以将UserSessionComponent保留在Application中。
class YourApplication : Application() {

    lateinit var appComponent : ApplicationComponent
    lateinit var userSessionComponent : UserSessionComponent

    override fun onCreate() {
        //...
        initAppComponent();
        createUserSession();
    }

    private fun initAppComponent() {
         appComponent = DaggerApplicationComponent.builder().application(this).build()
    }

    fun createUserSession() {
        userSessionComponent = appComponent.userSessionComponent().create()
    }
}

现在,只要Application有效,您所有ApplicationComponent范围内的依赖项都将保留在Application中并得到维护。 UserSessionComponent将维护所有寿命较短的依赖项(只要用户会话有效,就存在)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...