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.
118 lines
6.1 KiB
118 lines
6.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),
|
|
"image-gallery" => CreateImageGalleryPageViewModel(screen),
|
|
"udp-client" => CreateUdpClientPageViewModel(screen),
|
|
"udp-server" => CreateUdpServerPageViewModel(screen),
|
|
"node-canvas" => CreateNodeCanvasPageViewModel(screen),
|
|
"plink-manager" => CreatePlinkPageViewModel(screen),
|
|
"ssh-manager" => CreateSshPageViewModel(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);
|
|
}
|
|
|
|
private ImageGalleryPageViewModel CreateImageGalleryPageViewModel(IScreen screen)
|
|
{
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<ImageGalleryPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<ImageGalleryPageViewModel>(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<ImageGalleryPageViewModel>.Instance);
|
|
}
|
|
|
|
private UdpClientPageViewModel CreateUdpClientPageViewModel(IScreen screen)
|
|
{
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<UdpClientPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<UdpClientPageViewModel>(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<UdpClientPageViewModel>.Instance);
|
|
}
|
|
|
|
private UdpServerPageViewModel CreateUdpServerPageViewModel(IScreen screen)
|
|
{
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<UdpServerPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<UdpServerPageViewModel>(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<UdpServerPageViewModel>.Instance);
|
|
}
|
|
|
|
private NodeCanvasPageViewModel CreateNodeCanvasPageViewModel(IScreen screen)
|
|
{
|
|
var nodeCanvasService = _serviceProvider.GetRequiredService<AuroraDesk.Core.Interfaces.INodeCanvasService>();
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<NodeCanvasPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<NodeCanvasPageViewModel>(_serviceProvider, screen, nodeCanvasService, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<NodeCanvasPageViewModel>.Instance);
|
|
}
|
|
|
|
private PlinkPageViewModel CreatePlinkPageViewModel(IScreen screen)
|
|
{
|
|
var plinkService = _serviceProvider.GetRequiredService<IPlinkSessionService>();
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<PlinkPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<PlinkPageViewModel>(_serviceProvider, screen, plinkService, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<PlinkPageViewModel>.Instance);
|
|
}
|
|
|
|
private SshPageViewModel CreateSshPageViewModel(IScreen screen)
|
|
{
|
|
var sshService = _serviceProvider.GetRequiredService<ISshSessionService>();
|
|
var logger = _serviceProvider.GetService<Microsoft.Extensions.Logging.ILogger<SshPageViewModel>>();
|
|
return ActivatorUtilities.CreateInstance<SshPageViewModel>(_serviceProvider, screen, sshService, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger<SshPageViewModel>.Instance);
|
|
}
|
|
}
|
|
|
|
|