В инъекции зависимостей 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)
}