kosi-libs / Kodein

Painless Kotlin Dependency Injection
https://kosi-libs.org/kodein
MIT License
3.19k stars 174 forks source link

Implement KSP to create custom builder giving access to resolved API #427

Closed romainbsl closed 1 year ago

romainbsl commented 1 year ago

Example

@Resolved
interface MyAppResolver : DIResolver, MyFirstLibResolver {
    @Tag("ABC")
    fun foo(str: String): Foo
}

@Resolved
interface MyFirstLibResolver : DIResolver, MySecondLibResolver {
    fun bar(): Bar
}

@Resolved
interface MySecondLibResolver: DIResolver {
    fun baz(): Baz
}

private val appResolver: MyAppResolver = DI.ofMyAppResolver {
    bindSingletonOf(::Bar)
    bind { singleton { new(::Baz) } }
    bindFactory("ABC") { _: String -> Foo(bar()) }
}

@Test
fun check_AppResolver() {
    appResolver.check()
    assertNotSame(
        illegal = appResolver.foo("HELLO"),
        actual = appResolver.foo("ROMAIN")
    )
}