using Minesweeper.Commands; using Minesweeper.Config; using Minesweeper.Core; using Minesweeper.ECS; using Minesweeper.Presentation.Adapters; using Minesweeper.Presentation.Factories; using Minesweeper.Presentation.Presenters; using Minesweeper.Presentation.ReadModels; using Minesweeper.Presentation.Views; using UnityEngine; using VContainer; using VContainer.Unity; namespace Minesweeper.Infrastructure { public sealed class MinesweeperLifetimeScope : LifetimeScope { [SerializeField] private MinesweeperGameConfig gameConfig; [SerializeField] private MinesweeperUiConfig uiConfig; [SerializeField] private MinesweeperScreenCatalog screenCatalog = new MinesweeperScreenCatalog(); [SerializeField] private Transform contentRoot; [SerializeField] private TopPanelView topPanelView; [SerializeField] private MainMenuView mainMenuView; [SerializeField] private GameView gameView; protected override void Configure(IContainerBuilder builder) { builder.RegisterInstance(GetConfig()); var resolvedUiConfig = GetUiConfig(); builder.RegisterInstance(resolvedUiConfig); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As().As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); var screenRefs = SpawnScreens(); if (screenRefs.MainMenuView != null) { mainMenuView = screenRefs.MainMenuView; } if (gameView != null && screenRefs.BoardPanel != null) { gameView.BindScreens(screenRefs); } if (topPanelView != null) { topPanelView.BindConfig(resolvedUiConfig); builder.RegisterComponent(topPanelView).As(); } else { builder.Register(Lifetime.Singleton).As(); } if (mainMenuView != null) { builder.RegisterComponent(mainMenuView).As(); } else { builder.Register(Lifetime.Singleton).As(); } if (gameView != null) { gameView.BindConfig(resolvedUiConfig); builder.RegisterComponent(gameView).As(); } else { builder.Register(Lifetime.Singleton).As(); } builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton).As(); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.RegisterEntryPoint(); } private MinesweeperGameConfig GetConfig() { if (gameConfig != null) { return gameConfig; } return ScriptableObject.CreateInstance(); } private MinesweeperUiConfig GetUiConfig() { if (uiConfig != null) { return uiConfig; } return ScriptableObject.CreateInstance(); } private MinesweeperScreenRefs SpawnScreens() { if (contentRoot == null || screenCatalog == null || !screenCatalog.IsValid) { return default; } return new MinesweeperScreenBootstrapper().Spawn(contentRoot, screenCatalog); } } }