如何动态更改依赖项?
How to dynamically change a dependency?
我有一个名为 CrmRepository
的接口,我从中实现了两个 类 SuiteCrmRepository
和 OneCrmRepository
,它们是我的应用程序的数据源。
我想在用户使用不同帐户登录时动态交换依赖项(数据源)。
我使用 Koin 将存储库注入构造函数中的视图模型:
class ModuleViewModel(private var crmRepo: CrmRepository) :ViewModel() {}
并像这样在 koin 中声明模块:
fun provideCrmRepository(
): CrmRepository {
return if (crmType == CrmType.SUITE) {
SuiteCrmRepository()
} else if (crmType == CrmType.ONE){
OneCrmRepository()
}
}
single {
provideCrmRepository()
}
问题是一旦创建了 ModuleViewModel
,也会创建 CrmRepository
的单个实例,当创建新的 ModuleViewModel
时无法更改或再次创建但是在我更改了 crmType
变量之后。
您应该使用 factory 关键字而不是 single.
we declare our MySimplePresenter class as factory to have a create a new instance each time our Activity will need one.
通过使用单个关键字,Koin 提供相同的对象实例。
将行更改为;
factory {
provideCrmRepository()
}
另一个解决方案可能是在 crmType 更改时卸载和加载模块。
我有一个名为 CrmRepository
的接口,我从中实现了两个 类 SuiteCrmRepository
和 OneCrmRepository
,它们是我的应用程序的数据源。
我想在用户使用不同帐户登录时动态交换依赖项(数据源)。
我使用 Koin 将存储库注入构造函数中的视图模型:
class ModuleViewModel(private var crmRepo: CrmRepository) :ViewModel() {}
并像这样在 koin 中声明模块:
fun provideCrmRepository(
): CrmRepository {
return if (crmType == CrmType.SUITE) {
SuiteCrmRepository()
} else if (crmType == CrmType.ONE){
OneCrmRepository()
}
}
single {
provideCrmRepository()
}
问题是一旦创建了 ModuleViewModel
,也会创建 CrmRepository
的单个实例,当创建新的 ModuleViewModel
时无法更改或再次创建但是在我更改了 crmType
变量之后。
您应该使用 factory 关键字而不是 single.
we declare our MySimplePresenter class as factory to have a create a new instance each time our Activity will need one.
通过使用单个关键字,Koin 提供相同的对象实例。
将行更改为;
factory {
provideCrmRepository()
}
另一个解决方案可能是在 crmType 更改时卸载和加载模块。