Skip to main content

Koin for Ktor

note

The koin-ktor project is updated for Ktor 2.0.1

The koin-ktor project is dedicated to bring dependency injection for Ktor.

Install Koin & inject

To start a Koin container in Ktor, just install the Koin plugin like follow:

fun Application.main() {
// Install Ktor features
install(Koin) {
slf4jLogger()
modules(helloAppModule)
}

}
note

You can also start it from outside of Ktor, but you won't be compatible with autoreload feature.

Injection in Application

Koin inject() and get() functions are available from Application class:

fun Application.main() {
//...

// Lazy inject HelloService
val service by inject<HelloService>()

// Routing section
routing {
get("/hello") {
call.respondText(service.sayHello())
}
}
}

Declaring Koin for a Ktor Module

For a Ktor module, you can load specific Koin modules. Just declare them with koin { } function:

fun Application.module2() {
koin {
// load appModule2 for module2 Ktor module
modules(appModule2)
}

}

Injecting in Routing & Route

Koin inject() and get() functions are available from Route & Routing classes:

fun Routing.v1() {

// Lazy inject HelloService from within a Ktor Routing Node
val service by inject<HelloService>()

get("/v1/hello") {
call.respondText("[/v1/hello] " + service.sayHello())
}
}

From Route class:

fun Route.hello() {

// Lazy inject HelloService from within a Ktor Route
val service by inject<HelloService>()

get("/v1/bye") {
call.respondText("[/v1/bye] " + service.sayHello())
}
}

Events

You can listen to KTor Koin events:

fun Application.main() {
// ...

// Install Ktor features
environment.monitor.subscribe(KoinApplicationStarted) {
log.info("Koin started.")
}

environment.monitor.subscribe(KoinApplicationStopPreparing) {
log.info("Koin stopping...")
}

environment.monitor.subscribe(KoinApplicationStopped) {
log.info("Koin stopped.")
}

//...
}