假设我有两个接口,例如:
interface LetterClassifier
interface NumberClassifier
Run Code Online (Sandbox Code Playgroud)
然后这些接口将应用于这个类:
class Classifier() : LetterClassifier, NumberClassifier
Run Code Online (Sandbox Code Playgroud)
现在,我想提供这些实例只是作为LetterClassifier和NumberClassifier不作为Classifier在Koin。
我认为这样做的方法是:
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)
你这样做的方式实际上是正确的方式!这是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)
虽然这将为两个接口创建一个单独的单个实例。
| 归档时间: |
|
| 查看次数: |
3000 次 |
| 最近记录: |