fix(wpf): 添加配置文件缺失时的默认配置支持

This commit is contained in:
ssss
2026-07-03 14:27:42 +08:00
parent 266317d948
commit c9be8f4ed2
4 changed files with 120 additions and 0 deletions

View File

@@ -1,8 +1,12 @@
using System.IO;
using System.Windows; using System.Windows;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Serilog;
using WCTDataMiner.Core.Extensions; using WCTDataMiner.Core.Extensions;
using WCTDataMiner.Core.Services; using WCTDataMiner.Core.Services;
using WCTDataMiner.Wpf.Configuration;
using WCTDataMiner.Wpf.ViewModels; using WCTDataMiner.Wpf.ViewModels;
using WCTDataMiner.Wpf.Views; using WCTDataMiner.Wpf.Views;
@@ -14,12 +18,52 @@ namespace WCTDataMiner.Wpf;
public partial class App : Application public partial class App : Application
{ {
private IHost? _host; private IHost? _host;
private ILogger? _logger;
protected override void OnStartup(StartupEventArgs e) 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<App>();
if (!configFileExists)
{
_logger.Information("配置文件 appsettings.json 不存在,使用默认配置启动");
}
_logger.Information("WCTDataMiner WPF 应用启动");
_host = Host.CreateDefaultBuilder() _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) => .ConfigureServices((context, services) =>
{ {
// 添加 Serilog
services.AddSerilog();
// 注册 Core 层服务 // 注册 Core 层服务
services.AddDatabaseServices(context.Configuration); services.AddDatabaseServices(context.Configuration);
services.AddApplicationServices(); services.AddApplicationServices();
@@ -48,6 +92,8 @@ public partial class App : Application
protected override void OnExit(ExitEventArgs e) protected override void OnExit(ExitEventArgs e)
{ {
_logger?.Information("WCTDataMiner WPF 应用退出");
Log.CloseAndFlush();
_host?.Dispose(); _host?.Dispose();
base.OnExit(e); base.OnExit(e);
} }

View File

@@ -0,0 +1,37 @@
using System.IO;
using Microsoft.Extensions.Configuration;
namespace WCTDataMiner.Wpf.Configuration;
/// <summary>
/// 配置加载器 - 支持配置文件缺失时的默认配置
/// </summary>
public static class ConfigurationLoader
{
/// <summary>
/// 加载配置,如果文件不存在则使用默认配置
/// </summary>
/// <param name="basePath">配置文件基础路径</param>
/// <param name="configFileExists">输出参数:指示配置文件是否存在</param>
/// <returns>配置对象</returns>
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();
}
}

View File

@@ -0,0 +1,30 @@
namespace WCTDataMiner.Wpf.Configuration;
/// <summary>
/// 默认应用配置 - 当配置文件缺失时使用
/// </summary>
public static class DefaultAppSettings
{
/// <summary>
/// 获取默认配置字典
/// </summary>
public static Dictionary<string, string?> GetDefaultConfiguration()
{
return new Dictionary<string, string?>
{
// 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"
};
}
}

View File

@@ -20,6 +20,13 @@
<!-- DI --> <!-- DI -->
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<!-- Logging -->
<PackageReference Include="Serilog" Version="4.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>