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.

97 lines
3.7 KiB

2 months ago
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;
2 months ago
using ReactiveUI;
using Splat;
2 months ago
using System;
using System.IO;
namespace AuroraDesk;
2 months ago
public partial class App : Avalonia.Application
2 months ago
{
private IServiceProvider? _serviceProvider;
private ILogger<App>? _logger;
/// <summary>
/// 无参构造函数,用于 Avalonia 框架初始化
/// </summary>
public App()
{
}
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
// 注册自定义 ViewLocator
Locator.CurrentMutable.RegisterConstant(new Presentation.Views.ViewLocator(), typeof(IViewLocator));
2 months ago
}
public override void OnFrameworkInitializationCompleted()
{
var host = CreateHostBuilder().Build();
_serviceProvider = host.Services;
_logger = _serviceProvider.GetRequiredService<ILogger<App>>();
// 注册 ServiceProvider 到 Splat,以便 ViewLocator 可以使用依赖注入创建 View
Locator.CurrentMutable.RegisterConstant(_serviceProvider, typeof(IServiceProvider));
2 months ago
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
var mainWindow = _serviceProvider.GetRequiredService<AuroraDesk.Presentation.Views.MainWindow>();
desktop.MainWindow = mainWindow;
2 months ago
}
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();
2 months ago
logging.AddDebug();
})
.ConfigureServices((context, services) =>
{
services.Configure<AppSettings>(context.Configuration.GetSection("AppSettings"));
// 注册服务
2 months ago
services.AddBusinessServices();
services.AddViewModels();
services.AddNavigationService();
2 months ago
services.AddReactiveUI();
// 注册 MainWindowViewModel
services.AddTransient<MainWindowViewModel>(provider =>
provider.GetRequiredService<AppViewModel>().MainWindowViewModel);
// 注册 MainWindow
services.AddTransient<AuroraDesk.Presentation.Views.MainWindow>(provider =>
{
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<AuroraDesk.Presentation.Views.MainWindow>();
var viewModel = provider.GetRequiredService<MainWindowViewModel>();
return new AuroraDesk.Presentation.Views.MainWindow(viewModel, logger);
});
2 months ago
});
}