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

Provide an Instance as its interface in Koin

假设我有两个接口,例如:

interface LetterClassifier
interface NumberClassifier

那么这些接口就会应用到这个class:

class Classifier() : LetterClassifier, NumberClassifier

现在,我只想将这些实例提供为 LetterClassifierNumberClassifier,而不是 Koin 中的 Classifier

我想到的方法是:

module {
    val classifier = Classifier()

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

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

您这样做实际上是正确的方法!这是另一个例子 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() }

虽然这为两个接口创建一个单独的实例。

您可以 类型绑定到您的定义,就像 official article 中描述的那样:

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

如果你想完全排除 Classifier 类型,你可以这样做:

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

你可以有一个函数或一个单例来提供实例,

single<NumberClassifier> { Singleton.createClassifier() }
single<LetterClassifier> { Singleton.createClassifier() }