Синглтон с кодеином не сохраняется при введении из нескольких классов - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь внедрить одноэлементные зависимости менеджера конфигурации в разные модули, для которых я мог создать Scope and Context, содержащий StandardScopeRegistry. Но это не работает. Ниже приведен пример кода:

Подход 1

класс A.kt

import org.kodein.di.bindings.Scope
import org.kodein.di.bindings.ScopeRegistry
import org.kodein.di.bindings.StandardScopeRegistry

object SingletonScope : Scope<GlobalKodeinContext> {

    override fun getRegistry(context: GlobalKodeinContext): ScopeRegistry =
            context.standardScopeRegistry as? ScopeRegistry
                    ?: StandardScopeRegistry().also { context.standardScopeRegistry = it }

}

class GlobalKodeinContext {

    var standardScopeRegistry = StandardScopeRegistry()

}

Bindings.kt

val deploymentConfigManagerBinding = Kodein.Module("deployment_config_manager", false) {
      bind<IConfigManager>() with scoped(SingletonScope).singleton { ConfigManager() }
}

класс B.kt

private val configManager: IConfigManager by kodein.on(context = GlobalKodeinContext()).instance<IConfigManager>()

configManager.initializeConfigs(values)

класс C.kt

private val configManager: IConfigManager by kodein.on(context = GlobalKodeinContext()).instance<IConfigManager>()

configManager.getConfigs()

подход 2 Я не предпочитаю статические объекты контекста, но все равно пробовал какничего не работает

GlobalKodeinContext.kt

class GlobalKodeinContext {
    companion object {
        var appContext: Application? = null //Setting this in MainApplication with `this`
    }
}

Bindings.kt

val deploymentConfigManagerBinding = Kodein.Module("deployment_config_manager", false) {
    bind<IConfigManager>() with scoped(WeakContextScope.of<Application>()).singleton { ConfigManager() }

    registerContextTranslator { context: Application -> context.applicationContext }
}

A.kt

override val kodeinContext = kcontext(GlobalKodeinContext.appContext)

private val configManager: IConfigManager by instance()

configManager.initializeConfigs(values)

B.kt

override val kodeinContext = kcontext(GlobalKodeinContext.appContext)

private val configManager: IConfigManager by instance()

configManager.getConfigs()

configManager.getConfigs () дает исключение нулевого указателя в обоих подходах, поскольку конфигурации не инициализируются для объекта-одиночки, внедренного в класс C.

Я считаю, что создание контекста некорректно. Пожалуйста помоги. Спасибо!

...