我有一个功能,我需要为不同的用户提供不同的房间数据库。
我正在使用 Dagger 2 创建房间数据库。我的应用程序组件创建一个房间数据库。当用户切换到另一个用户时,我想为此创建新的房间数据库,我需要创建新的应用程序组件。我能够做到这一点,但旧的仍然存在。如何销毁旧的应用程序组件并创建新的应用程序组件。
我在应用程序类中定义应用程序组件,如下所示:
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
范围不同的组件中。拥有。然后,您可以随时轻松地重建此组件,并且所有与用户 session 严格相关的依赖项都将被分离。
例如。 (记下我的头顶,所以 未经过 测试)
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.
}
@Module(subcomponents = UserSessionComponent::class)
class SubcomponentsModule {}
ApplicationComponent
: @Singleton
@Component(modules = [SubcomponentsModule::class])
interface ApplicationComponent {
fun userSessionComponent(): UserSessionComponent.Factory
}
UserSessionComponent
在您的 Application
只要保持用户 session (用户未切换)。 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
将维护所有生命周期较短的依赖项(只要用户 session 有效就存在)。
关于android - 是否可以使 Dagger 应用程序组件无效并在android中创建一个新的 Dagger 应用程序组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63373328/