Koin 在模块之间共享实例



我正在使用Koin库进行Android项目。我想在模块之间共享一些实例,因为它们在整个应用程序中被大量使用。例如:

val moduleA = module {
    scope(named<FragmentA>()) {
        scoped { FirebaseFirestore.getInstance() }
        scoped { LocalDatabase.getInstance(App.sContext) }
        scoped { NetworkDataSourceA(get()) }    
    }
}
val moduleB = module {
        scope(named<FragmentB>()) {
            scoped { FirebaseFirestore.getInstance() }
            scoped { LocalDatabase.getInstance(App.sContext) }
            scoped { NetworkDataSourceB(get()) }    
        }
    }

从以下模块中我们可以看到,两个模块之间的FirebaseFirestore.getInstance()LocalDatabase.getInstance(App.sContext)是相同的。有没有办法让我声明一个包含FirebaseFirestore.getInstance()LocalDatabase.getInstance(App.sContext)moduleC,然后在moduleAmoduleB上调用它?

  • 可以通过创建范围来执行此操作。虽然我没有尝试过。

    val moduleA = module {
    scope(named("CommonScope")) {
    scoped { FirebaseFirestore.getInstance() }
    scoped { LocalDatabase.getInstance(App.sContext) }
    scoped { NetworkDataSourceA(get()) }   
    scoped { NetworkDataSourceB(get()) }  
      }
    }
    
  • 现在,使用以下行在 FragmentA 中创建您的范围。对于网络数据源 B 的片段 B 也是如此(

    private val commonScope = getKoin().getOrCreateScope("scope1",named("CommonScope"))
    val networkDataSourceA = commonScope.get<NetworkDataSourceA>()
    
  • 和 在onDestroy方法

    commonScope.close()
    

    有关更多详细信息,请查看koin文档(第8点(

根据 koin 文档,

默认情况下,如果在当前作用域中找不到定义,则所有作用域回退以在主作用域中解析。

我建议将依赖项放在父范围中。

val appModule = module {
     single { FirebaseFirestore.getInstance() }
     single { LocalDatabase.getInstance(App.sContext)} 
}

并将此模块加载到您的startKoin中,以便它在任何地方都可用。

最新更新