android - 是否可以使 Dagger 应用程序组件无效并在android中创建一个新的 Dagger 应用程序组件

标签 android kotlin dependency-injection dagger-2

我有一个功能,我需要为不同的用户提供不同的房间数据库。
我正在使用 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.
    }
    
  • 通知 Dagger 子组件的新模块:
  • @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/

    相关文章:

    kotlin - 如何合并2个单独的流,如何从中缓冲填充的数据并在一段时间后进行订阅

    java - 如何使用 Dagger2 实现工厂

    c# - 通过 Controller Factory 注入(inject)实例

    java - Appium - 创建 session - 错误 : Either JSONWP or W3C capabilities should be provided

    java - "App isn' t 响应“一旦启动应用程序

    php - 通过 PHP 或 Android 处理 SQLite 时是否需要更新后读取然后验证更新数据?

    Kotlin:遍历集合中的每一对(或通常固定大小的子集)

    android - 地理编码器阻止我的 Android 应用程序

    kotlin - 如何记录空 Mono

    dependency-injection - 异步工厂的依赖注入(inject)解析