【问题标题】:How do I use custom configuration in Ktor?如何在 Ktor 中使用自定义配置?
【发布时间】:2019-05-22 07:17:52
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: ktor koin


    【解决方案1】:

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

    【讨论】:

    • 不需要使用 Config 对象。没有状态的 IMO 对象只是添加了不必要的样板代码。您可以为此使用顶级函数。
    【解决方案2】:

    好的,我想我现在有一个很好、干净的方法。诀窍是不要费心通过框架本身。您可以非常轻松地获得整个配置,就像这些酷炫的 HOCON 文件:

    val config = ConfigFactory.load()
    

    然后您可以自己遍历树并构建您的对象,或者使用一个名为config4k 的项目来为您构建模型类。所以,我上面的设置添加了更多配置,但变得更简单和更易于维护:

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

    希望有人觉得这很有用!

    【讨论】:

      【解决方案3】:

      你也可以试试这个解决方案:

      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。

      【讨论】:

        猜你喜欢
        • 2023-02-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多