Укажите экземпляр в качестве интерфейса в Koin.

Допустим, у меня есть два интерфейса, например:

interface LetterClassifier
interface NumberClassifier

Затем эти интерфейсы будут применяться к этому классу:

class Classifier() : LetterClassifier, NumberClassifier

Теперь я хочу предоставить эти экземпляры только как LetterClassifier и NumberClassifier, а не как Classifier в Koin.

Я думаю об этом, делая:

module {
    val classifier = Classifier()

    single<NumberClassifier> { classifier }
    single<LetterClassifier> { classifier }
}

Но я не думаю, что это правильный путь. Может ли кто-нибудь направить меня?


person Archie G. Quiñones    schedule 06.09.2019    source источник


Ответы (2)


Вы можете привязать типы к своему определению, как это описано на официальная статья:

single { Classifier() } binds arrayOf(LetterClassifier::class, NumberClassifier::class)

Если вы хотите вообще исключить тип Classifier, вы можете сделать что-то вроде:

single<LetterClassifier> { Classifier() } bind NumberClassifier::class
person Dima S    schedule 18.09.2019

То, как вы это делаете, на самом деле правильно! Вот еще один пример из документов Koin, делающий то же самое :

class DataRepository()
interface Presenter
class MyPresenter(val repository : Repository) : Presenter

val myModule = module {
    // Define a singleton for type  DataRepository
    single { DataRepository() }

    // Define a factory (create a new instance each time) for type Presenter (infered parameter in <>) 
    // Resolve constructor dependency with get()
    factory<Presenter> { MyPresenter(get()) }
}

При этом следует отметить одну маленькую вещь: ваш подход немедленно создает экземпляр во время обработки объявления модуля, в то время как размещение вызовов конструктора в single lambdas будет создавать экземпляры при необходимости:

single<NumberClassifier> { Classifier() }
single<LetterClassifier> { Classifier() }

Хотя это будет создавать отдельные экземпляры для обоих интерфейсов.

person zsmb13    schedule 06.09.2019
comment
Но я такой же экземпляр. Можно ли это сделать без немедленного создания экземпляра? Или я должен просто сделать экземпляр ленивым, чтобы он создавал его немедленно? - person Archie G. Quiñones; 06.09.2019