我有一个模块:
single{ (name: String) -> Person(name) }
当我这样做时:
val alice: Person by inject {parametersOf("Alice")}
val bob: Person by inject {parametersOf("Bob")}
我得到了2个Alice实例。除第一个参数外的所有参数都将被忽略。
有没有一种简单的方法可以使Koin将这2个区别对待?参数事先未知,因此我不能使用命名属性。 factory
也不做,我需要重用具有相同参数集的实例。
答案 0 :(得分:1)
Koin中没有直接的东西,但是很容易制作出这种效果的东西。
1)一个创建不存在的类:
setInterval
2)DistinctFactory的Koin单曲:
class DistinctFactory<K, V>(private val newInstance: (K) -> V) {
private val _locker = Any()
private val mRepo: HashMap<K, V> = HashMap()
operator fun get(id: K): V {
return mRepo[id] ?: run {
synchronized(_locker) {
mRepo[id] ?: run {
newInstance(id).also {
mRepo[id] = it
}
}
}
}
}
}
3)使用先前单曲的Koin工厂:
single { DistinctFactory<String, Person> { Person(it) } }
测试:
factory { (name: String) -> get<DistinctFactory<String, Person>>()[name] }