I am new to Koin and Ktor, trying to inject a serv...
# koin
a
I am new to Koin and Ktor, trying to inject a service into my routing. This is my module setup:
Copy code
val koinModule = module {
    single<ConnectionFactory> {
        ConnectionFactories.get(
            ConnectionFactoryOptions.builder()
                .option(ConnectionFactoryOptions.DRIVER, "postgres")
                .option(ConnectionFactoryOptions.HOST, "localhost")
                .option(ConnectionFactoryOptions.PORT, 5432)
                .option(ConnectionFactoryOptions.DATABASE, "om_database")
                .option(ConnectionFactoryOptions.USER, "postgres")
                .option(ConnectionFactoryOptions.PASSWORD, "password")
                .build()
        )
    }
    single<PostgresqlTables> { tables().postgresql(CitiesDto) }
    single<R2dbcSqlClient> { (connectionFactory: ConnectionFactory, tables: PostgresqlTables) ->
        connectionFactory.coSqlClient(
            tables
        )
    }
    single<CityService> { CityService(get()) }
}

fun Application.configureKoin() {
    install(Koin) {
        slf4jLogger()
        modules(koinModule)
    }
}
and here is my routing:
Copy code
fun Application.configureRouting() {
    val cityService by inject<CityService>()
    routing {
    // snip
The error I am getting is
INFO  [Koin] - * Instance creation error : could not create instance for '[Singleton:'org.ufoss.kotysa.R2dbcSqlClient']': org.koin.core.error.NoParameterFoundException: Can't get injected parameter #0 from DefinitionParameters[] for type 'io.r2dbc.spi.ConnectionFactory'
This is working for me:
Copy code
val koinModule = module {
    val connectionFactory = ConnectionFactories.get(
        ConnectionFactoryOptions.builder()
            .option(ConnectionFactoryOptions.DRIVER, "postgres")
            .option(ConnectionFactoryOptions.HOST, "localhost")
            .option(ConnectionFactoryOptions.PORT, 5432)
            .option(ConnectionFactoryOptions.DATABASE, "om_database")
            .option(ConnectionFactoryOptions.USER, "postgres")
            .option(ConnectionFactoryOptions.PASSWORD, "password")
            .build()
    )
    val tables = tables().postgresql(CitiesDto)
    single<R2dbcSqlClient> {
        connectionFactory.coSqlClient(
            tables
        )
    }
    single<CityService> { CityService(get()) }
}
a
yes `(connectionFactory: ConnectionFactory, tables: PostgresqlTables)`form indicates to Koin that you manually pass this to the definition. Else to retrieve a particular dep, use
get<YourType>()
in your definition