首页 > 解决方案 > Koin - 每个参数值的单个实例

问题描述

我有一个模块:

single{ (name: String) -> Person(name) }

当我做:

val alice: Person by inject {parametersOf("Alice")}
val bob: Person by inject {parametersOf("Bob")}

我得到了 2 个 Alice 的实例。除第一个参数之外的所有参数都将被忽略。

有没有一种简单的方法可以让 Koin 将这两者视为不同?参数是事先不知道的,所以我不能使用命名属性。factory也不行,我需要重用具有相同参数集的实例。

标签: koin

解决方案


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
                    }
                }
            }
        }
    }
}

2) DistinctFactory的Koin单曲:

single { DistinctFactory<String, Person> { Person(it) } }

3) 使用之前单曲的 Koin 工厂:

factory { (name: String) -> get<DistinctFactory<String, Person>>()[name] }

测试:

val alice: Person by inject {parametersOf("Alice")}
val bob: Person by inject {parametersOf("Bob")}
val aliceAgain: Person by inject {parametersOf("Alice")}

alice === aliceAgain

推荐阅读