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
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);
|
|
}
|
|
}
|
|
|
|
|