我正在将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)
在两个模块之间是相同的。
有没有一种方法可以让我声明包含moduleC
和FirebaseFirestore.getInstance()
的{{1}},然后在LocalDatabase.getInstance(App.sContext)
和moduleA
上调用它? >
答案 0 :(得分:0)
您可以通过创建范围来做到这一点。虽然我没有尝试。
val moduleA = module {
scope(named("CommonScope")) {
scoped { FirebaseFirestore.getInstance() }
scoped { LocalDatabase.getInstance(App.sContext) }
scoped { NetworkDataSourceA(get()) }
scoped { NetworkDataSourceB(get()) }
}
}
现在,使用下面的代码行在FragmentA中创建作用域。( FragmentB也适用于NetworkDataSourceB)
private val commonScope = getKoin().getOrCreateScope("scope1",named("CommonScope"))
val networkDataSourceA = commonScope.get<NetworkDataSourceA>()
并使用onDestroy
方法
commonScope.close()
有关更多详细信息,请检查koin documentation(第8点)
答案 1 :(得分:0)
根据koin文档,
默认情况下,如果在当前作用域中未找到任何定义,则所有作用域回退都将在主作用域中解决。
我建议将依赖项放在父级范围内。
val appModule = module {
single { FirebaseFirestore.getInstance() }
single { LocalDatabase.getInstance(App.sContext)}
}
将此模块加载到您的 startKoin 中,以便随处可用。