如何动态改变依赖关系?

问题描述

我有一个名为CrmRepository的接口,从中实现了两个类SuiteCrmRepositoryOneCrmRepository,它们是我的应用程序的数据源。

每当用户使用其他帐户登录时,我都希望动态交换依赖关系(数据源)。

我使用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 关键字而不是单个

我们将MySimplePresenter类声明为factory,以在每次Activity需要一个实例时创建一个新实例。

Koin使用单个关键字提供相同的对象实例。

将行更改为;

factory {
   provideCrmRepository()
}

crmType 更改时,另一个解决方案可能是卸载和加载模块。