Как получить список связанных экземпляров синглтона одного типа?

Учитывая экземпляр кодеина:

interface SharedInterface {}

class A : SharedInterface
class B : SharedInterface
class C : SharedInterface
class D

fun main(args: Array<String>) {

    val kodein = Kodein {
       bind<A>() with singleton { A() }
       bind<B>() with singleton { B() }
       bind<C>() with singleton { C() }
       bind<D>() with singleton { D() }
    }
}

Есть ли способ получить экземпляры A, B, C, но не D из кодеина?

Самое близкое, что я получил, было:

val singletonBindings = kodein.container.bindings.filterValues { it is SingletonBinding<*> }
val singletonInstances = singletonBindings.map { it.value.getInstance(???, ???, Unit) }

Связывание с набором не помогло, так как я не смог связать отдельный экземпляр как set-enabled-type, а тип, который я хочу, чтобы он был связан как:

interface SharedInterface {}

class A : SharedInterface
class B : SharedInterface
class C : SharedInterface
class D

fun main(args: Array<String>) {

    val kodein = Kodein {
        bind() from setBinding<SharedInterface>()

        bind<A>().inSet() with singleton { A() }
        bind<B>().inSet() with singleton { B() }
        bind<C>().inSet() with singleton { C() }
        bind<D>().inSet() with singleton { D() }
    }

    val shared = kodein.instance<Set<SharedInterface>>()
}

причины Exception in thread "main" java.lang.IllegalStateException: No set binding to bind<Set<out A>>() with ? { ? }

Это решает проблему, но уродливо:

  val kodein = Kodein {
        bind() from setBinding<SharedInterface>()

        bind<SharedInterface>().inSet() with singleton { instance<A>() }
        bind<SharedInterface>().inSet() with singleton { instance<B>() }
        bind<SharedInterface>().inSet() with singleton { instance<C>() }

        bind<A>() with singleton { A() }
        bind<B>() with singleton { B() }
        bind<C>() with singleton { C() }
        bind<D>() with singleton { D() }
    }

    val shared = kodein.instance<Set<SharedInterface>>()

1 ответ

В Кодейне 4 нет способа сделать это, кроме того, что вы только что сделали. Можете ли вы открыть билет на GitHub Кодейна? Я могу успеть втиснуть это в Кодеин 5;)

Другие вопросы по тегам