Я пытаюсь внедрить одноэлементные зависимости менеджера конфигурации в разные модули, для которых я мог создать 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.
Я считаю, что создание контекста некорректно. Пожалуйста помоги. Спасибо!