//explicit binding looks pretty complex and fragile since I didn't use any of packages. public void ConfigureDependencies(DependencyResolver dependencies) { //configure UI manager windows mapping var uiManager = new UIManager(_uiContainer, new Dictionary <string, UIWindowConfiguration>() { { UIWindow.STRING_MAIN_MENU_WINDOW_ID, new UIWindowConfiguration( () => new MainMenuWindowController(), () => new MainMenuWindowModel( dependencies.Resolve <IGameStateManager>(), dependencies.Resolve <LevelManager>()), _mainMenuViewPrefab ) }, { UIWindow.STRING_GAME_WINDOW_ID, new UIWindowConfiguration( () => new GameWindowController(), () => new GameWindowModel(dependencies.Resolve <IInputManager>()), _gameViewPrefab ) } }); var boardManager = new BoardManager(); var blockFactory = new BlockFactory(_blockPrefab); var brickFactory = new BrickFactory(_brickPrefab, blockFactory); var gameManager = new GameManager(brickFactory, boardManager, () => dependencies.Resolve <IGameStateManager>().SetState(GameStateType.MainMenu));//horrible solution but there no time left LevelManager levelManager = new LevelManager(_levels, new CompositeObserver <LevelData>(brickFactory, _gameLoopManager)); //configure MonoBehaviour services _gameLoopManager.Init(new CompositeObserver <TickPassedParams>(gameManager)); _inputManager.Init(new CompositeObserver <InputReceivedParams>(gameManager, _gameLoopManager)); //configure application state machine var gameStateManager = new GameStateManager(new[] { new Tuple <GameStateType, Func <GameState> >(GameStateType.MainMenu, () => new GameState(() => { dependencies.Resolve <IUIManager>().OpenWindow(UIWindow.STRING_MAIN_MENU_WINDOW_ID); }, () => { dependencies.Resolve <IUIManager>().CloseWindow(UIWindow.STRING_MAIN_MENU_WINDOW_ID); })), new Tuple <GameStateType, Func <GameState> >(GameStateType.Game, () => new GameState(() => { dependencies.Resolve <IUIManager>().OpenWindow(UIWindow.STRING_GAME_WINDOW_ID); }, () => { dependencies.Resolve <IUIManager>().CloseWindow(UIWindow.STRING_GAME_WINDOW_ID); })), }, new CompositeObserver <GameStateType>(_gameLoopManager, gameManager)); //bind dependencies in order to retrieve them later in runtime dependencies.Bind <IGameStateManager>(gameStateManager); dependencies.Bind <IUIManager>(uiManager); dependencies.Bind(levelManager); dependencies.Bind <IInputManager>(_inputManager); }