using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using AuroraDesk.Infrastructure.Configuration; using AuroraDesk.Infrastructure.Extensions; using AuroraDesk.Presentation.Extensions; using AuroraDesk.Presentation.ViewModels; using AuroraDesk.Presentation.Views; using ReactiveUI; using Splat; using System; using System.IO; namespace AuroraDesk; public partial class App : Avalonia.Application { private IServiceProvider? _serviceProvider; private ILogger? _logger; /// /// 无参构造函数,用于 Avalonia 框架初始化 /// public App() { } public override void Initialize() { AvaloniaXamlLoader.Load(this); // 注册自定义 ViewLocator Locator.CurrentMutable.RegisterConstant(new Presentation.Views.ViewLocator(), typeof(IViewLocator)); } public override void OnFrameworkInitializationCompleted() { var host = CreateHostBuilder().Build(); _serviceProvider = host.Services; _logger = _serviceProvider.GetRequiredService>(); // 注册 ServiceProvider 到 Splat,以便 ViewLocator 可以使用依赖注入创建 View Locator.CurrentMutable.RegisterConstant(_serviceProvider, typeof(IServiceProvider)); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { var mainWindow = _serviceProvider.GetRequiredService(); desktop.MainWindow = mainWindow; } base.OnFrameworkInitializationCompleted(); } private IHostBuilder CreateHostBuilder() => Host.CreateDefaultBuilder() .ConfigureAppConfiguration((context, config) => { config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); }) .ConfigureLogging((context, logging) => { logging.ClearProviders(); logging.AddConfiguration(context.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); }) .ConfigureServices((context, services) => { services.Configure(context.Configuration.GetSection("AppSettings")); // 注册服务 services.AddBusinessServices(); services.AddViewModels(); services.AddNavigationService(); services.AddReactiveUI(); // 注册 MainWindowViewModel services.AddTransient(provider => provider.GetRequiredService().MainWindowViewModel); // 注册 MainWindow services.AddTransient(provider => { var loggerFactory = provider.GetRequiredService(); var logger = loggerFactory.CreateLogger(); var viewModel = provider.GetRequiredService(); return new AuroraDesk.Presentation.Views.MainWindow(viewModel, logger); }); }); }