【问题标题】:Koin - single instance per parameter valueKoin - 每个参数值的单个实例
【发布时间】:2020-06-16 19:29:17
【问题描述】:

我有一个模块:

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

当我这样做时:

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

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

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

【问题讨论】:

    标签: koin


    【解决方案1】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多