在我的应用程序中,我维护了一些 Kodein 上下文,并且在 Kodein 上下文中有一些共享资源,当不再需要它所属的上下文时,我想关闭这些资源。
下面是问题的简单说明:
class SomeConnectionPool: Closeable {
override fun close() { /* some operation */ }
}
class SomeResource: Closeable {
override fun close() { /* some operation */ }
}
class SomeService(val pool: SomeConnectionPool) {
fun doStuff() { /* some operation */ }
}
class SomeOtherService(val pool: SomeConnectionPool) {
fun doOtherStuff() { /* some operation */ }
}
val kodein = Kodein {
bind<SomeConnectionPool>() with singleton { SomeConnectionPool() }
bind<SomeResource>() with singleton { SomeResource() }
bind<SomeService>() with singleton { SomeService(instance()) }
bind<SomeOtherService>() with singleton { SomeOtherService(instance()) }
}
fun main(args: Array<String>) {
val service: SomeService by kodein.instance()
service.doStuff()
// this will initialize everything even the unused bindings
val resources by kodein.allInstances<Closeable>()
resources.forEach { it.close() }
}
理想情况下,应实现以下几个属性:
- 仅检索已初始化的可关闭实例并关闭它们
SomeService
和SomeOtherService
不应负责关闭SomeConnectionPool
,因为它们没有创建实例。他们也不知道游泳池是否仍在被其他东西使用。
我还考虑过只从 kodein.container 检索初始化的绑定,但似乎没有明显的方法可以做到这一点。
Kodein 5.1 可以满足您的需求。
看看:
- http://kodein.org/Kodein-DI/?5.1/core#scope-closeable
- http://kodein.org/Kodein-DI/?5.1/android#_android_scopes