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 BoardView boardView; [SerializeField] private PauseView pauseView; [SerializeField] private ResultView resultView; 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(); 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 (screenRefs.BoardView != null) { boardView = screenRefs.BoardView; } if (screenRefs.PauseView != null) { pauseView = screenRefs.PauseView; } if (screenRefs.ResultView != null) { resultView = screenRefs.ResultView; } 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 (boardView != null) { boardView.BindConfig(resolvedUiConfig); builder.RegisterComponent(boardView).As(); } else { builder.Register(Lifetime.Singleton).As(); } if (pauseView != null) { builder.RegisterComponent(pauseView).As(); } else { builder.Register(Lifetime.Singleton).As(); } if (resultView != null) { builder.RegisterComponent(resultView).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); 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); } } }