我正在使用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
,然后在moduleA
和moduleB
上调用它?
-
可以通过创建范围来执行此操作。虽然我没有尝试过。
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中,以便它在任何地方都可用。