using UnityEngine; using Zenject; using DanroJump.Audio; using DanroJump.Prizes; using DanroJump.SceneFlow; namespace DanroJump.Settings { /// /// ProjectContext/SceneContext installer сервисных настроек. /// ProjectContext/SceneContext installer глобальных сервисов. /// public sealed class AppServicesInstaller : MonoInstaller { [SerializeField] private string databaseAddress = ServiceSettingsAddressKeys.Database; [SerializeField] private ServiceSettingsDatabase fallbackDatabase; [SerializeField] private GameAudioSettings audioSettings; [SerializeField] private string fileName = "service-settings.json"; [SerializeField] private string prizeSessionStateFileName = "prize-session-state.json"; [SerializeField] private bool loadImmediately = true; [SerializeField] private bool bindActionsInScene = true; /// /// Загружает базу настроек, создает сервис и регистрирует его в DI-контейнере. /// public override void InstallBindings() { var databaseProvider = new AddressableServiceSettingsDatabaseProvider(databaseAddress, fallbackDatabase); var database = databaseProvider.Load(); if (database == null) { Debug.LogError($"{nameof(AppServicesInstaller)} could not load {nameof(ServiceSettingsDatabase)}.", this); databaseProvider.Dispose(); Container.BindInterfacesAndSelfTo().AsSingle(); return; } var repository = new JsonServiceSettingsRepository(fileName); var prizeSessionRepository = new JsonPrizeSessionStateRepository(prizeSessionStateFileName); var service = new ServiceSettingsService(database, repository); if (loadImmediately) { service.Load(); } Container.BindInstance(database).AsSingle(); Container.Bind().FromInstance(databaseProvider).AsSingle(); Container.Bind().FromInstance(databaseProvider).AsSingle(); Container.Bind().FromInstance(repository).AsSingle(); Container.Bind().FromInstance(service).AsSingle(); Container.Bind().FromInstance(service).AsSingle(); Container.Bind().FromInstance(prizeSessionRepository).AsSingle(); Container.BindInterfacesAndSelfTo().AsSingle(); Container.BindInterfacesAndSelfTo().AsSingle(); if (audioSettings != null) { Container.BindInstance(audioSettings).AsSingle(); } Container.BindInterfacesAndSelfTo().AsSingle().NonLazy(); Container.BindInterfacesTo().AsSingle().WithArguments(bindActionsInScene).NonLazy(); } } }