koin - 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 中没有直接这样的东西,但很容易做出以这种方式工作的东西。
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
推荐阅读
- css - 剪辑路径七边形保持边界半径
- azure-functions - 如何通过服务总线触发代码设置服务总线主题的锁定持续时间?
- travis-ci - Github 推送后部署期间 Travis CI 密码提示
- java - 如何在不考虑 java 中的前导零的情况下将字符串解析为 BigDecimal?
- c# - 正则表达式 C# - 中间的可选组
- html - 需要帮助使 2 个 div 与 svg 重叠
- javascript - Highcharts 9.1.1 使用打印选项从全屏导出 - 在浏览器控制台上抛出错误 Uncaught TypeError: a.hasAttribute is not a function
- c# - 为 Visual Studio C# 菜单创建“添加接口”按钮
- filter - SwiftUI - 在另一个视图上使用 Picker 对 API 调用的结果进行排序
- mysql - 使用通知逻辑构建群聊