Синглтон-инжектор Koin с закрытым параметром - PullRequest
0 голосов
/ 05 февраля 2019

Здравствуйте, я только изучаю Koin, как этот класс Dagger2 будет представлен в Koin 2.0?

@Singleton
open class AppExecutors(private val diskIO: Executor, private val networkIO: Executor, private val mainThread: Executor) {

    @Inject
    constructor() : this(
            Executors.newSingleThreadExecutor(),
            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
            MainThreadExecutor())

    fun diskIO(): Executor {
        return diskIO
    }

    fun networkIO(): Executor {
        return networkIO
    }

    fun mainThread(): Executor {
        return mainThread
    }

    private class MainThreadExecutor : Executor {
        private val mainThreadHandler = Handler(Looper.getMainLooper())
        override fun execute(command: Runnable) {
            mainThreadHandler.post(command)
        }
    }
}

Я пробовал это:

single<AppExecutors> { AppExecutors(
    Executors.newSingleThreadExecutor(),
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
    AppExecutors.MainThreadExecutor())
}

Но AppExecutors.MainThreadExecutor() является приватным.Это единственное решение сделать его публичным?

1 Ответ

0 голосов
/ 05 февраля 2019

Ну, это немного странная идея внедрить что-то, что является частной реализацией, извне, используя DI.

Также решение в Dagger2 - это хитрость, которая фактически работает вокруг внедрения зависимостей.

Итак, вам нужно принять решение: хочу ли я, чтобы это было частной реализацией?Если да, я бы предложил использовать значение параметра по умолчанию и использовать инъекцию только тогда, когда вам нужно переопределить эту реализацию, например, для тестирования.

open class AppExecutors(
    private val diskIO: Executor, 
    private val networkIO: Executor, 
    private val mainThread: Executor = AppExecutors.MainThreadExecutor()) {

И:

single<AppExecutors> { AppExecutors(
    Executors.newSingleThreadExecutor(),
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)))
}

(Имейте в виду, что использование значений параметров по умолчанию в Kotlin в конечном итоге аналогично использованию нескольких конструкторов в исходном примере.)

В противном случае вы должны сделать его публичным и извлечь его из класса.

...