Cómo inyectar dependencies en una aplicación ktor

La documentation habla sobre la dependency injection, pero realmente no muestra cómo se está haciendo.

La documentation no está completa y tiene muchos titulares: http://ktor.io/getting-started.html

Traté de crear mi function principal de forma que acepte el parámetro (que es mi dependencia), pero falló en el lado de la testing cuando llamé a la withTestApplication . Miré el código de la aplicación y vi que la Aplicación acepta un object de configuration, pero no tengo idea de cómo puedo cambiar ese object de configuration para inyectar algunas dependencies dentro de él.

 package org.jetbrains.ktor.application /** * Represents configunetworking 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 

En el código de testing usando withTestApplication tengo algo similar a lo siguiente:

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

Lo anterior withTestApplication fallaría si llamo a myMain con parameters (parameters que necesito simular e inyectar).

Actualizar:

El problema es que en mi event handling requestes, estoy usando una class de dependencia que se conecta a otros web services externos y hago algunas requestes, necesito una manera de poder insert esto para que en mis testings pueda ressaveme / burlarme y cambiar su comportamiento basado en mis casos de testing.

Ktor no tiene un mecanismo de dependency injection incorporado. Si necesita usar DI, necesitará usar cualquier marco que desee, como Guice, por ejemplo. Se vería algo como esto:

 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 ... } } 

De esta manera, delegará la composition de la aplicación a Guice y la creará como cualquier otra aplicación. Por ejemplo, puede componer diferentes partes de su aplicación de esta manera:

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

y luego vincularlo en un module principal:

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

asEagerSingleton es necesario para que Guice lo cree con entusiasmo ya que ningún otro service lo consultaría.