【问题标题】:Kodein Scopes, Bind database service to an activity lifecycleKodein Scopes,将数据库服务绑定到活动生命周期
【发布时间】:2021-02-03 10:51:06
【问题描述】:

在过去的一天里,我一直在尝试在 kodein 中实现一个自定义范围,但我正要扯掉我的头发。 我的应用程序基于 2 个活动,一个用于登录,另一个在用户登录时(我将其称为 MainActivity)。 我有几个单例服务从 Firestore 数据库中获取数据,我在 MainActivity 的许多片段中使用这些数据,我目前正在使用 Kodein 获取每个服务的单例对象。

我的服务总结:

class TagsService(context: Context): KodeinAware {
    override val kodein by closestKodein(context)

    val tags: MutableLiveData<ArrayList<Tag>> = MutableLiveData(ArrayList())

    // Other stuff fetching data and storing it in tags
}

还有我的 Kodein 应用程序中的服务

bind() from singleton { TagsService(applicationContext) }

在我的片段中,我只需要获取我的 tagsService 类

private val tagsService: TagsService by instance()

现在的问题是,当用户退出时,我必须在这种情况下清理所有标签,等待用户登录,创建一个新的查询等等,很多工作。但是,如果这个服务可以以某种方式被“杀死”,然后在用户登录时再次启动(回到 MainActivity,也没有保存它的最后一个状态,只是一个新对象),那么一切都会自动清理,而无需我编写很多代码。

目标:由于 MainActivity 仅在用户登录并经过正确身份验证时才处于“活动状态”,因此我想将生命周期附加到我的 TagsService 对象,每当 MainActivity 死时它也会杀死我的 tagsService ,然后每当 MainActivity 时“重新初始化”再次“活着”。

如果我很难理解我想要做什么,我非常抱歉,我对 kotlin 和整个编程都很陌生

【问题讨论】:

    标签: java android kotlin dependency-injection kodein


    【解决方案1】:

    要实现这一点,您可以使用 Kodein-DI 范围 (https://docs.kodein.org/kodein-di/7.3/core/using-environment.html#scope)。

    你像这样绑定你的服务:

    bind() from scoped(ActivityScope).singleton { TagsService(applicationContext) }
    

    其中ActivityScope 是您创建的范围、WeakContextScope.of&lt;Activity&gt;() 或 Kodein-DI 的 Android 模块中已捆绑的范围 (https://docs.kodein.org/kodein-di/7.3/framework/android.html)。

    因此,您可以通过以下方式注入服务:

    private val tagsService: TagsService by on(activityReference).instance()
    

    【讨论】:

    • Kodein 5.2 可以做到这一点吗?否则我将不得不等待,直到我更新到最新版本
    • 是的,范围在 5.0 中已经存在。 kodein.org/Kodein-DI/?5.0/core
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多