问题描述
我具有一项功能,需要为不同的用户提供不同的会议室数据库。 我正在使用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会话相关的所有依赖关系。
例如(写下我的头顶,所以未测试)
- 创建自定义
Scope
@Scope
@Retention(value = AnnotationRetention.RUNTIME)
annotation class UserSessionScope
- 创建一个
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.
}
- 一个用于通知Dagger子组件的新模块:
@Module(subcomponents = UserSessionComponent::class)
class SubcomponentsModule {}
- 在您的
ApplicationComponent
中:
@Singleton
@Component(modules = [SubcomponentsModule::class])
interface ApplicationComponent {
fun userSessionComponent(): UserSessionComponent.Factory
}
- 只要维持用户会话(不切换用户),就可以将
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
将维护所有寿命较短的依赖项(只要用户会话有效,就存在)。