fix(wpf): 添加配置文件缺失时的默认配置支持
This commit is contained in:
@@ -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<App>();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
37
src/WCTDataMiner.Wpf/Configuration/ConfigurationLoader.cs
Normal file
37
src/WCTDataMiner.Wpf/Configuration/ConfigurationLoader.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
30
src/WCTDataMiner.Wpf/Configuration/DefaultAppSettings.cs
Normal file
30
src/WCTDataMiner.Wpf/Configuration/DefaultAppSettings.cs
Normal 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"
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,13 @@
|
||||
<!-- DI -->
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" 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>
|
||||
|
||||
Reference in New Issue
Block a user