作用域可以使用作用域 Id 作为参数来创建对象吗?
Can scoping create objects using scope Id as a parameter?
我有一个提供我的密钥库的加密模块,以及一个允许我根据密钥名称从密钥库获取密钥的工厂,如下所示:
var cryptoModule = module {
single {
getKeyStore()
}
factory { (keyAlias: String) ->
getKey(keyAlias, get())
}
}
fun getKeyStore(): KeyStore
fun getKey(keyAlias: String, keyStore: KeyStore) : SecretKey
然后我希望能够创建一个用户会话,并根据 userId 取回一个 SecretKey 密钥,这是我用于 scopeId 的密钥,如下所示:
var sessionModule = module {
scope(name("SESSION")) {
scoped(name("sessionKey")) {
getKey(ScopeID(), get()
}
}
}
我试图让一切顺利进行,但当我调用 startKoin 并将其传递给我的加密和会话模块时,我最终崩溃了——抱怨没有提供 getKey 的第一个参数。我正在尝试像这样使用它:
lateinit var userId: String
val sessionScope = getKoin().createScope(userId,name("SESSION"))
val userKey : SecretKey by scope.inject(name("sessionKey"))
所以,我做错了什么? koin 可以支持这一点,还是我对范围的思考在某种程度上不正确?
我想通了。 scopeId 可用作参数 "id"。然后我可以通过将 id 传递给它来使用我的工厂从加密模块创建一个 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")),一切正常。
我有一个提供我的密钥库的加密模块,以及一个允许我根据密钥名称从密钥库获取密钥的工厂,如下所示:
var cryptoModule = module {
single {
getKeyStore()
}
factory { (keyAlias: String) ->
getKey(keyAlias, get())
}
}
fun getKeyStore(): KeyStore
fun getKey(keyAlias: String, keyStore: KeyStore) : SecretKey
然后我希望能够创建一个用户会话,并根据 userId 取回一个 SecretKey 密钥,这是我用于 scopeId 的密钥,如下所示:
var sessionModule = module {
scope(name("SESSION")) {
scoped(name("sessionKey")) {
getKey(ScopeID(), get()
}
}
}
我试图让一切顺利进行,但当我调用 startKoin 并将其传递给我的加密和会话模块时,我最终崩溃了——抱怨没有提供 getKey 的第一个参数。我正在尝试像这样使用它:
lateinit var userId: String
val sessionScope = getKoin().createScope(userId,name("SESSION"))
val userKey : SecretKey by scope.inject(name("sessionKey"))
所以,我做错了什么? koin 可以支持这一点,还是我对范围的思考在某种程度上不正确?
我想通了。 scopeId 可用作参数 "id"。然后我可以通过将 id 传递给它来使用我的工厂从加密模块创建一个 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")),一切正常。