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),
"image-gallery" => CreateImageGalleryPageViewModel(screen),
"udp-client" => CreateUdpClientPageViewModel(screen),
"udp-server" => CreateUdpServerPageViewModel(screen),
"node-canvas" => CreateNodeCanvasPageViewModel(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);
}
private ImageGalleryPageViewModel CreateImageGalleryPageViewModel(IScreen screen)
{
var logger = _serviceProvider.GetService>();
return ActivatorUtilities.CreateInstance(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance);
}
private UdpClientPageViewModel CreateUdpClientPageViewModel(IScreen screen)
{
var logger = _serviceProvider.GetService>();
return ActivatorUtilities.CreateInstance(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance);
}
private UdpServerPageViewModel CreateUdpServerPageViewModel(IScreen screen)
{
var logger = _serviceProvider.GetService>();
return ActivatorUtilities.CreateInstance(_serviceProvider, screen, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance);
}
private NodeCanvasPageViewModel CreateNodeCanvasPageViewModel(IScreen screen)
{
var nodeCanvasService = _serviceProvider.GetRequiredService();
var logger = _serviceProvider.GetService>();
return ActivatorUtilities.CreateInstance(_serviceProvider, screen, nodeCanvasService, logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance);
}
}