Закрытие / закрытие контекста Кодейна
Скажем, в моем приложении я поддерживаю несколько контекстов 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() }
}
В идеале есть несколько свойств, которые должны быть достигнуты:
- Извлекайте только экземпляры Closeable, которые уже инициализированы, и закрывайте их
SomeService
а такжеSomeOtherService
не должен нести ответственность за закрытиеSomeConnectionPool
так как они не создали экземпляр. Они также не знают, используется ли пул еще чем-то другим.
Я также решил извлечь только инициализированные привязки из kodein.container, но, похоже, нет очевидного способа сделать это.
1 ответ
Кодеин 5.1 вас охватил.
Посмотри на: