fix(wpf): 添加配置文件缺失时的默认配置支持
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
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 -->
|
<!-- 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>
|
||||||
|
|||||||
Reference in New Issue
Block a user