范围界定可以使用范围ID作为参数来创建对象吗?

时间:2019-11-04 21:19:51

标签: koin

我有一个提供我的密钥库的加密模块,还有一个工厂,允许我根据密钥名称从密钥库中获取秘密密钥,就像这样:

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可以支持这一点吗,还是我对范围的某种思考不正确?

1 个答案:

答案 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”))),一切正常。