作用域可以使用作用域 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")),一切正常。