我有一个提供我的密钥库的加密模块,还有一个工厂,允许我根据密钥名称从密钥库中获取秘密密钥,就像这样:
Register()
然后,我希望能够创建一个用户会话,并基于userId来获取SecretKey密钥,这是我用于scopeId的方式,
var cryptoModule = module {
single {
getKeyStore()
}
factory { (keyAlias: String) ->
getKey(keyAlias, get())
}
}
fun getKeyStore(): KeyStore
fun getKey(keyAlias: String, keyStore: KeyStore) : SecretKey
我正在尽一切努力,当我调用startKoin并将其传递给我的加密和会话模块时,我最终崩溃了–抱怨没有提供getKey的第一个参数。我正在尝试像这样使用它:
var sessionModule = module {
scope(name("SESSION")) {
scoped(name("sessionKey")) {
getKey(ScopeID(), get()
}
}
}
那么,我在做什么错? koin可以支持这一点吗,还是我对范围的某种思考不正确?
答案 0 :(得分:0)
我能够弄清楚这一点。 scopeId可用作参数“ id”。然后,我可以通过将ID传递给我的工厂,使用我的工厂从crypto模块创建一个SecretKey实例。
val sessionModule = module {
scope (named("session")) {
// create a SecretKey, with a named attribute
scoped(named("sessionKey")) {
// get it from the factory passing in the scope id
get<SecretKey> { parametersOf(id) }
}
scoped {
// get the session client and use the named session key
sessionClient(androidContext(), get(), get(), get(named("sessionKey")))
}
}
}
另一个键是访问该值。因为我需要初始化 具有userId的会话范围,我需要延迟初始化它,因此,我需要使用scope.get()方法从范围中检索对象。
private lateinit var sessionScope : Scope
private val sessionClient : OkHttpClient by lazy {
sessionScope.get<OkHttpClient>()
}
然后,只要我在设置sessionScope之前不尝试访问sessionClient,例如(sessionScope = getKoin()。createScope(userId,named(“ session”))),一切正常。