mirror of
https://github.com/jie65535/ChineseChess.git
synced 2024-07-27 18:55:00 +08:00
69 lines
2.0 KiB
C#
69 lines
2.0 KiB
C#
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<string, Type> _pages = new Dictionary<string, Type>();
|
|
private readonly IServiceProvider _serviceProvider;
|
|
|
|
public PageService(IServiceProvider serviceProvider)
|
|
{
|
|
_serviceProvider = serviceProvider;
|
|
Configure<MainViewModel, MainPage>();
|
|
Configure<SettingsViewModel, SettingsPage>();
|
|
}
|
|
|
|
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<VM, V>()
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|