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(); } /// /// test /// public IHost AppHost { get; } // Check if the service is registered in ConfigureServices within App.axaml.cs. public static T GetService() 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(); } /// /// 对需要进行即时加载的类进行实例化 /// private void InstantInit() { ServiceLocator.Initialize(AppHost.Services, _services); // 初始化事件总线 EventManager.RegListeners(); } /// /// 应用启动事件回调 /// private static void Startup() { Log.Information( """ _ _ _____ _ _ _ __ __ _______ | | | | /\ |_ _| | | | | | | \/ |__ __| | |__| | / \ | | | | | | | | \ / | | | | __ | / /\ \ | | _ | | | | | | |\/| | | | | | | |/ ____ \ _| |_ | |__| | |__| | | | | | | | |_| |_/_/ \_\_____| \____/ \____/ |_| |_| |_| 海炬巨量转移-应用启动完成 {0} """, DateTime.Now); // 发布系统启动完成通知 EventBus.Publish(EventType.StartUp, true); } /// /// 应用关闭事件回调 /// /// /// private static void Shutdown(object? sender, ControlledApplicationLifetimeExitEventArgs controlledApplicationLifetimeExitEventArgs) { Log.Information(""" ____ _ | __ ) _ _ ___ | | | _ \| | | |/ _ \ | | | |_) | |_| | __/ |_| |____/ \__, |\___| (_) |___/ 海炬点胶机-应用正在退出 {0} """, DateTime.Now); // 关闭相机连接 CameraManager.Close(); //关闭调度任务 SchedulerManager.Shutdown(); // 释放Serilog 资源 Log.CloseAndFlush(); // 系统退出 Environment.Exit(0); } }