在Koin中提供一个实例作为其接口

时间:2019-09-06 06:06:53

标签: kotlin koin

让我们说我有两个界面,例如:

interface LetterClassifier
interface NumberClassifier

然后这些接口将应用于此类:

class Classifier() : LetterClassifier, NumberClassifier

现在,我只想在LetterClassifier中以NumberClassifierClassifier的形式提供这些实例,而不以Koin的形式提供。

我想到的是这样做:

module {
    val classifier = Classifier()

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

但是我认为这不是正确的方法。有人可以引导我吗?

2 个答案:

答案 0 :(得分:1)

您的操作方式实际上是正确的方法!这是另一个示例from the Koin docs,它执行相同的操作:

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 lambda中会在需要时创建实例:

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

尽管为两个接口创建一个单独的单个实例。

答案 1 :(得分:1)

您可以绑定类型到您的定义,如official article中所述:

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

如果您想完全排除Classifier类型,可以执行以下操作:

single<LetterClassifier> { Classifier() } bind NumberClassifier::class