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.

47 lines
1.5 KiB

using System;
using Microsoft.Extensions.Logging;
using AuroraDesk.Core.Interfaces;
using ReactiveUI;
using Microsoft.Extensions.DependencyInjection;
namespace AuroraDesk.Presentation.ViewModels;
/// <summary>
/// 应用程序级别的 ViewModel,实现 IScreen 接口
/// </summary>
public class AppViewModel : ReactiveObject, IScreen
{
public RoutingState Router { get; }
private MainWindowViewModel? _mainWindowViewModel;
private readonly IServiceProvider _serviceProvider;
/// <summary>
/// MainWindowViewModel 的延迟初始化属性
/// 重构后:通过依赖注入获取,而不是直接 new,这样可以正确注入所有依赖
/// </summary>
public MainWindowViewModel MainWindowViewModel
{
get
{
if (_mainWindowViewModel == null)
{
// 通过依赖注入获取 MainWindowViewModel,确保所有依赖(INavigationStateService, ITabManagementService)正确注入
// 传入 this 作为 IScreen 参数
_mainWindowViewModel = ActivatorUtilities.CreateInstance<MainWindowViewModel>(
_serviceProvider,
this);
}
return _mainWindowViewModel;
}
}
public AppViewModel(IServiceProvider serviceProvider)
{
Router = new RoutingState();
_serviceProvider = serviceProvider;
// 注意:MainWindowViewModel 延迟创建,避免循环依赖
// MainWindowViewModel 将在首次访问时创建
}
}