¿Cómo se logra lo siguiente usando Koin DI?
single { AValidator() } bind IValidator::class single { BValidator() } bind IValidator::class single { CValidator() } bind IValidator::class single { DValidator() } bind IValidator::classEn la clase donde quiero que se inyecten todos los validadores, uso lo siguiente:
val validators: List<IValidator> by inject() Esperando que todas las implementaciones diferentes de la interfaz IValidator se inyecten automáticamente.
Sé que en realidad es compatible con Kodein, donde simplemente harías:
val validators: List<IValidator> by kodein.allInstances()
Me encantaría saber si esto es posible dentro de Koin.
¡Gracias!
Con Koin 2+, ahora puede declarar sus instancias individualmente
single { AValidator() } bind IValidator::class single { BValidator() } bind IValidator::class single { CValidator() } bind IValidator::class single { DValidator() } bind IValidator::class
Luego use getAll<TInterface> para solicitarlos todos
val validators: List<IValidator> = getKoin().getAll() // with lazy val validators: List<IValidator> by lazy { getKoin().getAll<IValidator>() }
Y use bind<TInterface, TImplementation> para solicitar una sola instancia
val validator: IValidator = getKoin().bind<IValidator, AValidator>()
Fuente
https://start.insert-koin.io/#/getting-started/modules-definitions?id=tipos-adicionales
Según la documentación, puedo hacer algo como lo siguiente:
single(name = "validators") { listOf(AValidator(), BValidator(), CValidator(), DValidator()) }Y recuperarlo con:
val validators: List<IValidator> by inject(name = "validators")Funciona por ahora, pero inyectar un solo validador de la lista anterior, por ejemplo, no funcionaría.
Para más detalles: https://insert-koin.io/docs/1.0/documentation/reference/index.html
¡Siéntase libre de agregar otra solución!