【问题标题】:How to dynamically change a dependency?如何动态更改依赖项?
【发布时间】:2020-12-13 04:07:24
【问题描述】:

我有一个名为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 之后,它无法更改或再次创建变量。

【问题讨论】:

    标签: android kotlin mvvm dependency-injection koin


    【解决方案1】:

    您应该使用 factory 关键字而不是 single

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

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

    将行改为;

    factory {
       provideCrmRepository()
    }
    

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

    【讨论】:

    • 谢谢,Koin 怎么知道 Activity 什么时候需要一个?这是否意味着它不会是单实例?
    • 我不确定。您可以查看有关核心概念、模块、范围和注入参数的文档。 doc.insert-koin.io/#/koin-core/modules
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2021-11-30
    • 2016-05-04
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多