Закрытие / закрытие контекста Кодейна

Скажем, в моем приложении я поддерживаю несколько контекстов 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 вас охватил.

Посмотри на:

Другие вопросы по тегам