Как вводить зависимости в ktor Application

Документация рассказывает об инъекции зависимостей, но на самом деле не показывает, как это делается.

Документация также не заполнена и имеет кучу владельцев мест: http://ktor.io/getting-started.html

Я попытался создать свою основную функцию таким образом, чтобы она принимала параметр (который является моей зависимостью), но это не сработало на тестовой стороне, когда я вызываю withTestApplication . Я просмотрел код приложения и увидел, что приложение принимает объект конфигурации, но я понятия не имею, как я могу изменить этот объект конфигурации, чтобы внедрить в него некоторые зависимости.

 package org.jetbrains.ktor.application /** * Represents configured and running web application, capable of handling requests */ class Application(val environment: ApplicationEnvironment) : ApplicationCallPipeline() { /** * Called by host when [Application] is terminated */ fun dispose() { uninstallAllFeatures() } } /** * Convenience property to access log from application */ val Application.log get() = environment.log 

В тестовом коде с использованием withTestApplication меня есть что-то похожее на приведенное ниже:

 @Test internal fun myTest() = withTestApplication (Application::myMain) 

Вышеизложенное с помощью withTestApplication неудачно, если я вызову myMain с параметрами (параметры, которые мне нужно myMain и ввести).

Обновить:

Проблема в том, что в моей обработке запросов я использую класс зависимостей, который подключается к другим веб-службам снаружи и выполняет некоторые запросы, мне нужен способ, чтобы иметь возможность вводить это, поэтому в моих тестах я могу заглушить / издеваться над ним и изменить его поведение, основанное на моих тестах.

Ktor не имеет встроенного механизма впрыска зависимостей. Если вам нужно использовать DI, вам нужно будет использовать любую фреймворк, какой вам нравится, например, Guice. Это будет выглядеть примерно так:

 fun Application.module() { Guice.createInjector(MainModule(this)) } // Main module, binds application and routes class MainModule(private val application: Application) : AbstractModule() { override fun configure() { bind(Application::class.java).toInstance(application) ... other bindings ... } } 

Таким образом, вы делегируете состав приложения в Guice и создаете его как любое другое приложение. Например, вы можете составлять различные части своего приложения следующим образом:

 class Hello @Inject constructor(application: Application) { init { application.routing { get("/") { call.respondText("Hello") } } } } 

а затем привяжите его в основном модуле:

 bind(Hello::class.java).asEagerSingleton() 

asEagerSingleton необходим, чтобы Guice создавал его с нетерпением, поскольку никакая другая служба не запрашивала его.