using System.Windows; using AutoMapper.Internal; using DMS.Application.Interfaces; using DMS.Application.Services; using DMS.Core.Enums; using DMS.Core.Interfaces; using DMS.Core.Interfaces.Repositories; using DMS.Helper; using DMS.Services.Processors; using DMS.WPF.ViewModels; using DMS.WPF.Views; using iNKORE.UI.WPF.Modern.Common.IconKeys; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog; using DMS.Extensions; using DMS.Infrastructure.Configurations; using DMS.Infrastructure.Data; using DMS.Infrastructure.Repositories; using DMS.Infrastructure.Services; using Microsoft.Extensions.Hosting; using DMS.WPF.Helper; using DMS.WPF.Services; using DMS.WPF.Services.Processors; using DMS.WPF.ViewModels.Dialogs; using DataProcessingService = DMS.Services.DataProcessingService; using IDataProcessingService = DMS.Services.IDataProcessingService; using LogLevel = Microsoft.Extensions.Logging.LogLevel; using DMS.Core.Interfaces.Services; using DMS.Infrastructure.Interfaces.Services; namespace DMS; /// /// Interaction logic for App.xaml /// public partial class App : System.Windows.Application { public IServiceProvider Services { get; } // public AppSettings Settings { get; private set; } public App() { Host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { ConfigureServices(services); }) .ConfigureLogging(loggingBuilder => { ConfigureLogging(loggingBuilder); }) .Build(); Services = Host.Services; } public new static App Current => (App)System.Windows.Application.Current; public IHost Host { get; } protected override async void OnStartup(StartupEventArgs e) { base.OnStartup(e); ShutdownMode = ShutdownMode.OnLastWindowClose; ThemeHelper.InitializeTheme(); await Host.StartAsync(); try { // var databaseInitializer = Host.Services.GetRequiredService(); // databaseInitializer.InitializeDataBase(); // await databaseInitializer.InitializeMenu(); // Settings = AppSettings.Load(); Host.Services.GetRequiredService(); // 初始化数据处理链 var dataProcessingService = Host.Services.GetRequiredService(); dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); //dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); } catch (Exception exception) { NotificationHelper.ShowError("加载数据时发生错误,如果是连接字符串不正确,可以在设置界面更改:{exception.Message}", exception); } var splashWindow = Host.Services.GetRequiredService(); splashWindow.Show(); // 根据配置启动服务 // var connectionSettings = DMS.Config.AppSettings.Load(); // if (connectionSettings.EnableMqttService) // { // Host.Services.GetRequiredService().StartService(); // } // if (connectionSettings.EnableOpcUaService) // { // Host.Services.GetRequiredService().StartService(); // } } protected override async void OnExit(ExitEventArgs e) { // 停止服务 await Host.StopAsync(); Host.Dispose(); LogManager.Shutdown(); base.OnExit(e); } private void ConfigureServices(IServiceCollection services) { // services.AddTransient(); // // // services.AddSingleton(); // services.AddSingleton(); // //services.AddSingleton(); services.AddSingleton(); // services.AddHostedService(); // services.AddHostedService(); // services.AddHostedService(); // // --- 核心配置 --- services.AddAutoMapper(cfg => { // 最终解决方案:根据异常信息的建议,设置此标记以忽略重复的Profile加载。 // 注意:此属性位于 Internal() 方法下。 cfg.Internal().AllowAdditiveTypeMapCreation = true; cfg.AddProfile(new DMS.Application.Profiles.MappingProfile()); cfg.AddProfile(new DMS.Infrastructure.Profiles.MappingProfile()); cfg.AddProfile(new DMS.WPF.Profiles.MappingProfile()); }); // 注册数据处理服务和处理器 services.AddSingleton(); services.AddHostedService(provider => (DataProcessingService)provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // 注册Core中的仓库 services.AddSingleton(); // services.AddSingleton(); // 2. 配置数据库上下文 (在测试中通常使用单例) services.AddSingleton(_ => { var appSettings = new AppSettings { Database = { Database = "dms_test" } }; return new SqlSugarDbContext(appSettings); }); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); // 注册App服务 services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); //注册WPF中的服务 services.AddSingleton(); // 注册视图模型 services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); //services.AddScoped(); services.AddSingleton(); services.AddSingleton(); // 注册对话框模型 services.AddTransient(); services.AddTransient(); services.AddTransient(); // 注册对话框 services.AddSingleton(); //注册View视图 services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddScoped(); services.AddScoped(); } private void ConfigureLogging(ILoggingBuilder loggingBuilder) { LogManager.Setup().LoadConfigurationFromFile("Config/nlog.config"); loggingBuilder.ClearProviders(); loggingBuilder.SetMinimumLevel(LogLevel.Trace); // loggingBuilder.AddNLog(); // 捕获未处理的异常并记录 AppDomain.CurrentDomain.UnhandledException += (sender, args) => { var ex = args.ExceptionObject as Exception; if (ex != null) { // 可以使用一个专用的 Logger 来记录未处理异常 LogManager.GetLogger("UnhandledExceptionLogger") .Fatal($"应用程序发生未处理的异常:{ex}"); } }; // 捕获 Dispatcher 线程上的未处理异常 (UI 线程) this.DispatcherUnhandledException += (sender, args) => { LogManager.GetLogger("DispatcherExceptionLogger") .Fatal($"UI 线程发生未处理的异常:{args.Exception}"); // 标记为已处理,防止应用程序崩溃 (生产环境慎用,可能掩盖问题) // args.Handled = true; }; // 如果您使用 Task (异步方法) 并且没有正确 await,可能会导致异常丢失, // 可以通过以下方式捕获 Task 中的异常。 TaskScheduler.UnobservedTaskException += (sender, args) => { LogManager.GetLogger("UnobservedTaskExceptionLogger") .Fatal($"异步任务发生未观察到的异常:{args.Exception}"); // args.SetObserved(); // 标记为已观察,防止进程终止 }; } }