Kodein Scopes,将数据库服务绑定到 activity 生命周期
Kodein Scopes, Bind database service to an activity lifecycle
在过去的一天里,我一直在尝试在 kodein 中实现一个自定义范围,但我快要崩溃了。
我的应用程序基于 2 个活动构建,一个 activity 用于登录,另一个用于用户登录(我将其称为 MainActivity)。
我有几个单例服务,它们从我在 MainActivity 中的许多片段中使用的 Firestore 数据库获取数据,我目前正在使用 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 class
private val tagsService: TagsService by instance()
现在的问题是,当用户注销时,在这种情况下我必须清理所有标签、等待用户登录、创建新查询等等,需要大量工作。但是如果这个服务可以以某种方式被“杀死”,然后在用户登录时再次启动(回到 MainActivity,也没有保存它的最后状态,只是一个新对象)一切都会自动清理,而不需要我写很多代码。
目标:由于 MainActivity 仅在用户登录并经过正确身份验证时处于“活动”状态,因此我想将生命周期附加到我的 TagsService 对象,每当 MainActivity 死亡时它也会杀死我的 tagsService 然后“重新初始化”每当 MainActivity 再次“存活”时。
如果很难理解我正在尝试做的事情,我非常抱歉,我对 kotlin 和整个编程都很陌生
要实现这一点,您可以使用 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<Activity>()
,或者是 Kodein-DI (https://docs.kodein.org/kodein-di/7.3/framework/android.html) 的 Android 模块中已经捆绑的范围.
因此,您可以通过以下方式注入您的服务:
private val tagsService: TagsService by on(activityReference).instance()
在过去的一天里,我一直在尝试在 kodein 中实现一个自定义范围,但我快要崩溃了。 我的应用程序基于 2 个活动构建,一个 activity 用于登录,另一个用于用户登录(我将其称为 MainActivity)。 我有几个单例服务,它们从我在 MainActivity 中的许多片段中使用的 Firestore 数据库获取数据,我目前正在使用 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 classprivate val tagsService: TagsService by instance()
现在的问题是,当用户注销时,在这种情况下我必须清理所有标签、等待用户登录、创建新查询等等,需要大量工作。但是如果这个服务可以以某种方式被“杀死”,然后在用户登录时再次启动(回到 MainActivity,也没有保存它的最后状态,只是一个新对象)一切都会自动清理,而不需要我写很多代码。
目标:由于 MainActivity 仅在用户登录并经过正确身份验证时处于“活动”状态,因此我想将生命周期附加到我的 TagsService 对象,每当 MainActivity 死亡时它也会杀死我的 tagsService 然后“重新初始化”每当 MainActivity 再次“存活”时。
如果很难理解我正在尝试做的事情,我非常抱歉,我对 kotlin 和整个编程都很陌生
要实现这一点,您可以使用 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<Activity>()
,或者是 Kodein-DI (https://docs.kodein.org/kodein-di/7.3/framework/android.html) 的 Android 模块中已经捆绑的范围.
因此,您可以通过以下方式注入您的服务:
private val tagsService: TagsService by on(activityReference).instance()