Cara, eu fiquei com algumas dúvidas, provavelmente porque eu conheço muito pouco de Kotlin, mas acho que você pode me ajudar a esclarecer algumas coisas.
A princípio, me parece que o ponto principal da solução pra lidar com dependências cíclicas é na verdade esse lateinit
, uma vez que ele trabalha com essa semântica da gente não precisar inicializar esses caras na construção do objeto, tanto que, eu fiz um teste aqui com o playground do Kotlin, fazendo DI "manual" (sem container automático), e dá certo, se liga:
class A {
lateinit var b: B
fun foo() {
b.bar();
}
fun bar() {
println("A!");
}
}
class B {
lateinit var a: A
fun foo() {
a.bar();
}
fun bar() {
println("B!");
}
}
fun main() {
val a = A();
val b = B();
a.b = b;
b.a = a;
a.foo();
b.foo();
}
Daí eu queria saber aonde entram os providers nessa história e, como seria uma implementação barebones deles.