185 lines
5.6 KiB
C#
185 lines
5.6 KiB
C#
|
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);
|
|||
|
}
|
|||
|
}
|