我有一个模块:
single{ (name: String) -> Person(name) }
Run Code Online (Sandbox Code Playgroud)
当我做:
val alice: Person by inject {parametersOf("Alice")}
val bob: Person by inject {parametersOf("Bob")}
Run Code Online (Sandbox Code Playgroud)
我得到了 2 个 Alice 实例。除第一个参数之外的所有参数都将被忽略。
有没有一种简单的方法可以让 Koin 将这两者视为不同的?参数事先不知道,因此我无法使用命名属性。factory也不会这样做,我需要重用具有相同参数集的实例。
Koin 中没有直接这样的东西,但是以这种方式制作一些东西很容易。
1) 一个不存在则创建的类:
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
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
2)DistinctFactory的Koin单曲:
single { DistinctFactory<String, Person> { Person(it) } }
Run Code Online (Sandbox Code Playgroud)
3)使用前单的Koin工厂:
factory { (name: String) -> get<DistinctFactory<String, Person>>()[name] }
Run Code Online (Sandbox Code Playgroud)
测试:
val alice: Person by inject {parametersOf("Alice")}
val bob: Person by inject {parametersOf("Bob")}
val aliceAgain: Person by inject {parametersOf("Alice")}
alice === aliceAgain
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1793 次 |
| 最近记录: |