You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

73 lines
3.1 KiB

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;
/// <summary>
/// PageViewModel 工厂实现
/// </summary>
public class PageViewModelFactory : IPageViewModelFactory
{
private readonly IServiceProvider _serviceProvider;
public PageViewModelFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public T CreatePageViewModel<T>(IScreen screen) where T : IRoutableViewModel
{
// 尝试从服务容器中获取已注册的 ViewModel
// 如果未注册,则使用反射创建实例
try
{
return _serviceProvider.GetService<T>() ??
(T)Activator.CreateInstance(typeof(T), screen)!;
}
catch
{
// 如果服务容器中没有且反射失败,尝试使用 ActivatorUtilities
return ActivatorUtilities.CreateInstance<T>(_serviceProvider, screen);
}
}
public IRoutableViewModel CreatePageViewModel(string pageId, IScreen screen)
{
return pageId switch
{
"dashboard" => CreatePageViewModel<DashboardPageViewModel>(screen),
"users" => CreatePageViewModel<UsersPageViewModel>(screen),
"users-list" => CreatePageViewModel<UsersPageViewModel>(screen),
"users-roles" => CreatePageViewModel<UsersPageViewModel>(screen),
"users-permissions" => CreatePageViewModel<UsersPageViewModel>(screen),
"settings" => CreatePageViewModel<SettingsPageViewModel>(screen),
"settings-general" => CreatePageViewModel<SettingsPageViewModel>(screen),
"settings-security" => CreatePageViewModel<SettingsPageViewModel>(screen),
"settings-backup" => CreatePageViewModel<SettingsPageViewModel>(screen),
"reports" => CreatePageViewModel<ReportsPageViewModel>(screen),
"help" => CreatePageViewModel<HelpPageViewModel>(screen),
"dialog-host" => CreatePageViewModel<DialogHostPageViewModel>(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<IconsPageViewModel>(_serviceProvider, screen);
}
private EditorPageViewModel CreateEditorPageViewModel(IScreen screen)
{
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<EditorPageViewModel>>();
return ActivatorUtilities.CreateInstance<EditorPageViewModel>(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<EditorPageViewModel>.Instance);
}
}