diff --git a/src/WCTDataMiner.Wpf/App.xaml.cs b/src/WCTDataMiner.Wpf/App.xaml.cs index d4fbc2b..400efe9 100644 --- a/src/WCTDataMiner.Wpf/App.xaml.cs +++ b/src/WCTDataMiner.Wpf/App.xaml.cs @@ -1,8 +1,12 @@ +using System.IO; using System.Windows; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Serilog; using WCTDataMiner.Core.Extensions; using WCTDataMiner.Core.Services; +using WCTDataMiner.Wpf.Configuration; using WCTDataMiner.Wpf.ViewModels; using WCTDataMiner.Wpf.Views; @@ -14,12 +18,52 @@ namespace WCTDataMiner.Wpf; public partial class App : Application { private IHost? _host; + private ILogger? _logger; protected override void OnStartup(StartupEventArgs e) { + // 使用 ConfigurationLoader 加载配置,支持文件缺失 + var configuration = ConfigurationLoader.LoadConfiguration( + AppDomain.CurrentDomain.BaseDirectory, + out var configFileExists); + + // 配置 Serilog - 从配置文件读取 + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .Enrich.FromLogContext() + .CreateLogger(); + + _logger = Log.ForContext(); + + if (!configFileExists) + { + _logger.Information("配置文件 appsettings.json 不存在,使用默认配置启动"); + } + + _logger.Information("WCTDataMiner WPF 应用启动"); + _host = Host.CreateDefaultBuilder() + .ConfigureAppConfiguration((context, configBuilder) => + { + configBuilder.Sources.Clear(); + configBuilder.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + + if (configFileExists) + { + configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + } + else + { + configBuilder.AddInMemoryCollection(DefaultAppSettings.GetDefaultConfiguration()); + } + + configBuilder.AddEnvironmentVariables("WCTDM_"); + }) .ConfigureServices((context, services) => { + // 添加 Serilog + services.AddSerilog(); + // 注册 Core 层服务 services.AddDatabaseServices(context.Configuration); services.AddApplicationServices(); @@ -48,6 +92,8 @@ public partial class App : Application protected override void OnExit(ExitEventArgs e) { + _logger?.Information("WCTDataMiner WPF 应用退出"); + Log.CloseAndFlush(); _host?.Dispose(); base.OnExit(e); } diff --git a/src/WCTDataMiner.Wpf/Configuration/ConfigurationLoader.cs b/src/WCTDataMiner.Wpf/Configuration/ConfigurationLoader.cs new file mode 100644 index 0000000..01a3cdb --- /dev/null +++ b/src/WCTDataMiner.Wpf/Configuration/ConfigurationLoader.cs @@ -0,0 +1,37 @@ +using System.IO; +using Microsoft.Extensions.Configuration; + +namespace WCTDataMiner.Wpf.Configuration; + +/// +/// 配置加载器 - 支持配置文件缺失时的默认配置 +/// +public static class ConfigurationLoader +{ + /// + /// 加载配置,如果文件不存在则使用默认配置 + /// + /// 配置文件基础路径 + /// 输出参数:指示配置文件是否存在 + /// 配置对象 + public static IConfiguration LoadConfiguration(string basePath, out bool configFileExists) + { + var settingsPath = Path.Combine(basePath, "appsettings.json"); + configFileExists = File.Exists(settingsPath); + + var builder = new ConfigurationBuilder().SetBasePath(basePath); + + if (configFileExists) + { + builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + } + else + { + // 使用默认配置 + builder.AddInMemoryCollection(DefaultAppSettings.GetDefaultConfiguration()); + } + + builder.AddEnvironmentVariables("WCTDM_"); + return builder.Build(); + } +} \ No newline at end of file diff --git a/src/WCTDataMiner.Wpf/Configuration/DefaultAppSettings.cs b/src/WCTDataMiner.Wpf/Configuration/DefaultAppSettings.cs new file mode 100644 index 0000000..cfd1221 --- /dev/null +++ b/src/WCTDataMiner.Wpf/Configuration/DefaultAppSettings.cs @@ -0,0 +1,30 @@ +namespace WCTDataMiner.Wpf.Configuration; + +/// +/// 默认应用配置 - 当配置文件缺失时使用 +/// +public static class DefaultAppSettings +{ + /// + /// 获取默认配置字典 + /// + public static Dictionary GetDefaultConfiguration() + { + return new Dictionary + { + // Serilog 配置 + ["Serilog:MinimumLevel:Default"] = "Information", + ["Serilog:MinimumLevel:Override:WCTDataMiner"] = "Debug", + ["Serilog:MinimumLevel:Override:Microsoft"] = "Warning", + ["Serilog:WriteTo:0:Name"] = "Console", + ["Serilog:WriteTo:1:Name"] = "File", + ["Serilog:WriteTo:1:Args:path"] = "./data/logs/wctdataminer-.log", + ["Serilog:WriteTo:1:Args:rollingInterval"] = "Day", + ["Serilog:WriteTo:1:Args:outputTemplate"] = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}", + + // 数据库配置 + ["Database:Type"] = "sqlite", + ["Database:Path"] = "./data/database/wctminer.db" + }; + } +} \ No newline at end of file diff --git a/src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj b/src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj index e0e4a8d..579420a 100644 --- a/src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj +++ b/src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj @@ -20,6 +20,13 @@ + + + + + + +