Dispenser/DispenserUI/App.axaml.cs

185 lines
5.6 KiB
C#
Raw Permalink Normal View History

2024-08-16 07:20:09 +00:00
using System;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using DispenserCommon.Events;
using DispenserCommon.Lazy;
using DispenserCommon.LogConfig;
using DispenserCommon.Utils;
using DispenserCore.IOC;
using DispenserCore.Job;
using DispenserHal.Camera.Factory;
using DispenserUI.Utils;
using DispenserUI.Views;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using SplashWindow = DispenserUI.Views.Windows.SplashWindow;
namespace DispenserUI;
public class App : Application
{
private readonly IHostBuilder _builder;
private IServiceCollection _services;
public App()
{
// Let's do this in the constructor
_builder = Host.CreateDefaultBuilder();
AppHost = _builder
// 开启加载配置文件
.ConfigureAppConfiguration((host, config) =>
{
var env = host.HostingEnvironment;
config.Sources.Clear();
config.AddIniFile("settings.ini", false, true)
.AddIniFile($"settings.{env.EnvironmentName}.ini", true, true)
.AddEnvironmentVariables();
})
.UseContentRoot(AppContext.BaseDirectory)
.ConfigureServices((context, services) =>
{
// Register services with the DI container here.
var components = IocScanner.Scan();
components.ForEach(component => { services.AddSingleton(component.Type, component.Implement); });
services.AddLazyResolution();
_services = services;
})
.Build();
}
/// <summary>
/// test
/// </summary>
public IHost AppHost { get; }
// Check if the service is registered in ConfigureServices within App.axaml.cs.
public static T GetService<T>()
where T : class
{
if ((Current as App)!.AppHost.Services.GetService(typeof(T)) is not T service)
throw new ArgumentException(
$"{typeof(T)} needs to be registered in ConfigureServices within App.axaml.cs.");
return service;
}
public override void Initialize()
{
// 对需要进行即时加载的类进行实例化
InstantInit();
AvaloniaXamlLoader.Load(this);
}
public override async void OnFrameworkInitializationCompleted()
{
// remove each entry found
BindingPlugins.DataValidators.Insert(0, new CustomExceptionValidationPlugin());
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
// 先配置启动页
var splashWindow = new SplashWindow();
desktop.MainWindow = splashWindow;
desktop.Exit += Shutdown;
try
{
// 进行系统初始化操作
await splashWindow.Init();
// 设置主窗口
var mainWindow = new MainWindow();
desktop.MainWindow = mainWindow;
mainWindow.Show();
splashWindow.Close();
}
catch (Exception e)
{
Console.WriteLine($"系统初始化异常: {e}");
splashWindow.Close();
return;
}
}
// 开启serilog 收集日志
Log.Logger = LogConfiguration.GetLogger();
_builder.UseSerilog(Log.Logger);
base.OnFrameworkInitializationCompleted();
// 进行初始化完成通知
Startup();
}
/// <summary>
/// 对需要进行即时加载的类进行实例化
/// </summary>
private void InstantInit()
{
ServiceLocator.Initialize(AppHost.Services, _services);
// 初始化事件总线
EventManager.RegListeners();
}
/// <summary>
/// 应用启动事件回调
/// </summary>
private static void Startup()
{
Log.Information(
"""
_ _ _____ _ _ _ __ __ _______
| | | | /\ |_ _| | | | | | | \/ |__ __|
| |__| | / \ | | | | | | | | \ / | | |
| __ | / /\ \ | | _ | | | | | | |\/| | | |
| | | |/ ____ \ _| |_ | |__| | |__| | | | | | | |
|_| |_/_/ \_\_____| \____/ \____/ |_| |_| |_|
- {0}
""", DateTime.Now);
// 发布系统启动完成通知
EventBus<bool>.Publish(EventType.StartUp, true);
}
/// <summary>
/// 应用关闭事件回调
/// </summary>
/// <param name="sender"></param>
/// <param name="controlledApplicationLifetimeExitEventArgs"></param>
private static void Shutdown(object? sender,
ControlledApplicationLifetimeExitEventArgs controlledApplicationLifetimeExitEventArgs)
{
Log.Information("""
____ _
| __ ) _ _ ___ | |
| _ \| | | |/ _ \ | |
| |_) | |_| | __/ |_|
|____/ \__, |\___| (_)
|___/
-退 {0}
""", DateTime.Now);
// 关闭相机连接
CameraManager.Close();
//关闭调度任务
SchedulerManager.Shutdown();
// 释放Serilog 资源
Log.CloseAndFlush();
// 系统退出
Environment.Exit(0);
}
}