В инъекции зависимостей Kodein, как вы можете внедрить экземпляры самого Kodein в экземпляры?

В Kodein у меня есть модули, импортированные в родительский модуль, и иногда классам нужен экземпляр Kodein, чтобы они могли сделать инъекцию позже. Проблема в следующем коде:

val parentModule = Kodein {
    import(SomeService.module)
}

куда SomeService.module нужен экземпляр Kodein на потом, но Kodein еще не создан. Передача его позже в модуль кажется плохой идеей.

В кодейне 3.x Я вижу, что есть kodein-conf модуль, который имеет глобальный экземпляр, но я хочу избежать глобального.

Как другие модули или классы получают экземпляр Kodein?

Примечание: этот вопрос намеренно написан и получен ответ от автора ( Вопросы с самоотвечением), так что идиоматические ответы на часто задаваемые темы Kotlin/Kodein присутствуют в SO.

1 ответ

Решение

В кодейне 3.x (и, возможно, более старые версии) у вас есть доступ к свойству в рамках инициализации любого модуля с именем kodein что вы можете использовать в своих привязках.

Внутри вашего модуля привязка будет выглядеть так:

bind<SomeService>() with singleton { SomeService(kodein) }

Для полного примера и использования разделения интерфейсов и реализации, это может выглядеть примерно так:

interface SomeService {
   // ...
}

class DefaultSomeService(val kodein: Kodein): SomeService {
    companion object {
        val module = Kodein.Module {
            bind<SomeService>() with singleton { DefaultSomeService(kodein) }
        }
    }

    val mapper: ObjectMapper = kodein.instance()
    // ...
}

Вы можете импортировать модуль из родительского, как вы заметили, и он получит собственную ссылку на текущий экземпляр Kodein.

val kodein = Kodein {
    import(DefaultSomeService.module)
}
Другие вопросы по тегам