如何在Ktor中使用自定义配置?

时间:2018-12-21 21:54:30

标签: ktor koin

我正在挖掘内置的配置支持,并想使用它(而不是仅仅与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())

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

添加到现有的已接受答案中。使用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())

答案 1 :(得分:1)

好的,我想我现在有一个很好的方法。诀窍是不要去麻烦框架本身。您可以非常轻松地获得完整的配置,例如这些炫酷的HOCON文件:

val config = ConfigFactory.load()

然后您可以自己走树并构建对象,或使用名为config4k的项目为您构建模型类。因此,我上面的设置增加了更多配置,但变得更加简单和可维护:

installKoin(listOf(
            mybatisModule(config.extract("mybatis")),
            zendeskModule(config.extract("zendesk")),
            appModule),
        logger = SLF4JLogger())

希望有人觉得这有用!

答案 2 :(得分:0)

您也可以尝试以下解决方案:

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。