using AuroraDesk.Core.Interfaces; using AuroraDesk.Presentation.ViewModels.Base; using AuroraDesk.Presentation.ViewModels.Pages; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveUI; using System; namespace AuroraDesk.Presentation.Services; /// /// PageViewModel 工厂实现 /// public class PageViewModelFactory : IPageViewModelFactory { private readonly IServiceProvider _serviceProvider; public PageViewModelFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public T CreatePageViewModel(IScreen screen) where T : IRoutableViewModel { // 尝试从服务容器中获取已注册的 ViewModel // 如果未注册,则使用反射创建实例 try { return _serviceProvider.GetService() ?? (T)Activator.CreateInstance(typeof(T), screen)!; } catch { // 如果服务容器中没有且反射失败,尝试使用 ActivatorUtilities return ActivatorUtilities.CreateInstance(_serviceProvider, screen); } } public IRoutableViewModel CreatePageViewModel(string pageId, IScreen screen) { return pageId switch { "dashboard" => CreatePageViewModel(screen), "users" => CreatePageViewModel(screen), "users-list" => CreatePageViewModel(screen), "users-roles" => CreatePageViewModel(screen), "users-permissions" => CreatePageViewModel(screen), "settings" => CreatePageViewModel(screen), "settings-general" => CreatePageViewModel(screen), "settings-security" => CreatePageViewModel(screen), "settings-backup" => CreatePageViewModel(screen), "reports" => CreatePageViewModel(screen), "help" => CreatePageViewModel(screen), "dialog-host" => CreatePageViewModel(screen), "icons" => CreateIconsPageViewModel(screen), "editor" => CreateEditorPageViewModel(screen), _ => throw new ArgumentException($"Unknown page: {pageId}", nameof(pageId)) }; } private IconsPageViewModel CreateIconsPageViewModel(IScreen screen) { // ActivatorUtilities 会自动解析所有依赖(IIconService, ILogger) return ActivatorUtilities.CreateInstance(_serviceProvider, screen); } private EditorPageViewModel CreateEditorPageViewModel(IScreen screen) { var logger = _serviceProvider.GetService>(); return ActivatorUtilities.CreateInstance(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance); } }