Как использовать пользовательскую конфигурацию в Ktor?
Я копаю встроенную поддержку конфигурации и хочу использовать ее (вместо того, чтобы просто катать свою собственную рядом с Ktor'ом), но мне трудно понять, как это сделать чистым способом. У меня есть это, и это работает, но это действительно уродливо, и я чувствую, что должен быть лучший способ:
val myBatisConfig = MyBatisConfig(
environment.config.property("mybatis.url").getString(),
environment.config.property("mybatis.driver").getString(),
environment.config.property("mybatis.poolSize").getString().toInt())
installKoin(listOf(mybatisModule(myBatisConfig), appModule), logger = SLF4JLogger())
Спасибо за любую помощь!
1 ответ
Хорошо, я думаю, у меня есть хороший, чистый способ сделать это сейчас. Хитрость заключается в том, чтобы не беспокоить прохождение самой структуры. Вы можете получить всю свою конфигурацию, как эти классные файлы HOCON, очень легко:
val config = ConfigFactory.load()
И тогда вы можете сами ходить по дереву и строить свои объекты, или использовать проект под названием config4k
который создаст ваши классы моделей для вас. Итак, моя установка выше добавила больше настроек, но стала намного проще и удобнее в обслуживании:
installKoin(listOf(
mybatisModule(config.extract("mybatis")),
zendeskModule(config.extract("zendesk")),
appModule),
logger = SLF4JLogger())
Надеюсь, кто-то найдет это полезным!
Добавление к существующему принятому ответу. Реализация с использованиемConfigFactory.load()
может выглядеть так (без библиотек):
object Config {
@KtorExperimentalAPI
val config = HoconApplicationConfig(ConfigFactory.load())
@KtorExperimentalAPI
fun getProperty(key: String): String? = config.propertyOrNull(key)?.getString()
@KtorExperimentalAPI
fun requireProperty(key: String): String = getProperty(key)
?: throw IllegalStateException("Missing property $key")
}
Итак, класс config станет следующим:
val myBatisConfig = MyBatisConfig(
requireProperty("mybatis.url"),
requireProperty("mybatis.driver"),
requireProperty("mybatis.poolSize").toInt())
Вы также можете попробовать это решение:
class MyService(val url: String)
fun KoinApplication.loadMyKoins(environment: ApplicationEnvironment): KoinApplication {
val myFirstModule = module {
single { MyService(environment.config.property("mybatis.url").getString()) }
}
val mySecondModule = module {}
return modules(listOf(myFirstModule, mySecondModule))
}
fun Application.main() {
install(DefaultHeaders)
install(Koin) {
loadMyKoins(environment)
SLF4JLogger()
}
routing {
val service by inject<MyService>()
get("/") {
call.respond("Hello world! This is my service url: ${service.url}")
}
}
}
fun main(args: Array<String>) {
embeddedServer(Netty, commandLineEnvironment(args)).start()
}
HTH.