Почему не работает запрос requestInjection для объекта Kotlin - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в Guice. Я пытаюсь использовать requestInjection, чтобы таким образом внедрить зависимости синглтона kotlin object .

ПОДХОД 1 :

class SampleTest {

    @Test
    fun test() {
        Guice.createInjector(object: KotlinModule() {
            override fun configure() {
                requestInjection(A)
            }
        })
        assertEquals("Hello world", A.saySomething())
    }
}

object A {
    @Inject
    private lateinit var b: B

    fun saySomething(): String {
        return b.sayHello()
    }
}

class B {
    fun sayHello(): String {
        return "Hello world"
    }
}

Но я получаю эту ошибку:

kotlin.UninitializedPropertyAccessException: lateinit property b has not been initialized

Если я заменил A на класс без конструктора arg, это сработает.

ПОДХОД 2 :

class SampleTest {

    @Test
    fun test() {
        val a = A()
        Guice.createInjector(object: KotlinModule() {
            override fun configure() {
                requestInjection(a)
            }
        })
        assertEquals("Hello world", a.saySomething())
    }
}

class A {
    @Inject
    private lateinit var b: B

    fun saySomething(): String {
        return b.sayHello()
    }
}

class B {
    fun sayHello(): String {
        return "Hello world"
    }
}

Вместо этого, если я изменю requestInjection на requestStaticInjection , это также будет работать.

ПОДХОД 3 :

class SampleTest {

    @Test
    fun test() {
        Guice.createInjector(object: KotlinModule() {
            override fun configure() {
                requestStaticInjection<A>()
            }
        })
        assertEquals("Hello world", A.saySomething())
    }
}

object A {
    @Inject
    private lateinit var b: B

    fun saySomething(): String {
        return b.sayHello()
    }
}

class B {
    fun sayHello(): String {
        return "Hello world"
    }
}

Почему ПОДХОД 1 не работал? Почему APPROACH 2 и APPROACH 3 работают?

1 Ответ

0 голосов
/ 17 апреля 2019

Объекты Kotlin обрабатываются как статические синглтоны языка, т. Е. Их инициализация / реализация происходит вне рамок структуры внедрения зависимостей.

Поэтому при использовании KotlinModule для инъекции объекта необходимо использовать requestStaticInjection, как в ПОДХОД 3 , или изменить этот объект на класс, чтобы Guice KotlinModule видел это как non-static, как представлено в ПОДХОД 2

Надеюсь, это немного прояснит ситуацию.

...