让我们说我有两个界面,例如:
interface LetterClassifier
interface NumberClassifier
然后这些接口将应用于此类:
class Classifier() : LetterClassifier, NumberClassifier
现在,我只想在LetterClassifier
中以NumberClassifier
和Classifier
的形式提供这些实例,而不以Koin
的形式提供。
我想到的是这样做:
module {
val classifier = Classifier()
single<NumberClassifier> { classifier }
single<LetterClassifier> { classifier }
}
但是我认为这不是正确的方法。有人可以引导我吗?
答案 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