在 Koin 中提供一个实例作为其接口
Provide an Instance as its interface in Koin
假设我有两个接口,例如:
interface LetterClassifier
interface NumberClassifier
那么这些接口就会应用到这个class:
class Classifier() : LetterClassifier, NumberClassifier
现在,我只想将这些实例提供为 LetterClassifier
和 NumberClassifier
,而不是 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() }
假设我有两个接口,例如:
interface LetterClassifier
interface NumberClassifier
那么这些接口就会应用到这个class:
class Classifier() : LetterClassifier, NumberClassifier
现在,我只想将这些实例提供为 LetterClassifier
和 NumberClassifier
,而不是 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() }