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

Arc*_*nes 7 kotlin koin

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

interface LetterClassifier
interface NumberClassifier
Run Code Online (Sandbox Code Playgroud)

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

class Classifier() : LetterClassifier, NumberClassifier
Run Code Online (Sandbox Code Playgroud)

现在,我想提供这些实例只是作为LetterClassifierNumberClassifier不作为ClassifierKoin

我认为这样做的方法是:

module {
    val classifier = Classifier()

    single<NumberClassifier> { classifier }
    single<LetterClassifier> { classifier }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 18

您可以类型绑定到您的定义,就像官方文章中描述的那样:

single { Classifier() } binds arrayOf(LetterClassifier::class, NumberClassifier::class)
Run Code Online (Sandbox Code Playgroud)

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

single<LetterClassifier> { Classifier() } bind NumberClassifier::class
Run Code Online (Sandbox Code Playgroud)


zsm*_*b13 5

你这样做的方式实际上是正确的方式!这是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()) }
}
Run Code Online (Sandbox Code Playgroud)

执行此操作时要注意的一件小事:您的方法会在处理模块声明时立即创建一个实例,而将构造函数调用放在singlelambda 中会在需要时创建实例:

single<NumberClassifier> { Classifier() }
single<LetterClassifier> { Classifier() }
Run Code Online (Sandbox Code Playgroud)

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