using System; using System.Collections.Generic; using System.Linq; using System.Windows.Controls; using ChineseChess.GUI.Contracts.Services; using ChineseChess.GUI.ViewModels; using ChineseChess.GUI.Views; using Microsoft.Toolkit.Mvvm.ComponentModel; namespace ChineseChess.GUI.Services { public class PageService : IPageService { private readonly Dictionary _pages = new Dictionary(); private readonly IServiceProvider _serviceProvider; public PageService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; Configure(); Configure(); } public Type GetPageType(string key) { Type pageType; lock (_pages) { if (!_pages.TryGetValue(key, out pageType)) { throw new ArgumentException($"Page not found: {key}. Did you forget to call PageService.Configure?"); } } return pageType; } public Page GetPage(string key) { var pageType = GetPageType(key); return _serviceProvider.GetService(pageType) as Page; } private void Configure() where VM : ObservableObject where V : Page { lock (_pages) { var key = typeof(VM).FullName; if (_pages.ContainsKey(key)) { throw new ArgumentException($"The key {key} is already configured in PageService"); } var type = typeof(V); if (_pages.Any(p => p.Value == type)) { throw new ArgumentException($"This type is already configured with key {_pages.First(p => p.Value == type).Key}"); } _pages.Add(key, type); } } } }