Как получить список связанных экземпляров синглтона одного типа?
Учитывая экземпляр кодеина:
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;)