|
|
1 day ago | |
|---|---|---|
| .workflow | 1 day ago | |
| Apq.Cfg | 1 day ago | |
| Apq.Cfg.Database | 1 day ago | |
| Apq.Cfg.Ini | 1 day ago | |
| Apq.Cfg.Redis | 1 day ago | |
| Apq.Cfg.Toml | 1 day ago | |
| Apq.Cfg.Xml | 1 day ago | |
| Apq.Cfg.Yaml | 1 day ago | |
| Samples | 5 days ago | |
| benchmarks | 1 day ago | |
| buildTools | 3 days ago | |
| docs | 1 day ago | |
| tests | 1 day ago | |
| versions | 1 day ago | |
| .gitignore | 1 day ago | |
| Apq.Cfg.sln | 1 day ago | |
| Directory.Build.props | 1 day ago | |
| LICENSE | 6 days ago | |
| README.md | 1 day ago |
统一配置管理系统,支持多种配置格式和多层级配置合并。
仓库地址:https://gitee.com/apq/Apq.Cfg
GetSection),简化嵌套配置访问GetMany、SetMany 减少锁竞争,提升并发性能AddApqCfg 和 ConfigureApqCfg<T> 扩展方法ConfigChanges 订阅配置变更事件.NET 6.0 / 7.0 / 8.0 / 9.0
using Apq.Cfg;
var cfg = new CfgBuilder()
.AddJson("appsettings.json", level: 0, writeable: false)
.AddJson("appsettings.local.json", level: 1, writeable: true, isPrimaryWriter: true)
.AddEnvironmentVariables(level: 2, prefix: "APP_")
.Build();
// 读取配置
var value = cfg.Get("Database:ConnectionString");
// 使用配置节简化嵌套访问
var dbSection = cfg.GetSection("Database");
var host = dbSection.Get("Host");
var port = dbSection.Get<int>("Port");
// 枚举配置节的子键
foreach (var key in dbSection.GetChildKeys())
{
Console.WriteLine($"{key}: {dbSection.Get(key)}");
}
// 修改配置
cfg.Set("App:LastRun", DateTime.Now.ToString());
await cfg.SaveAsync();
支持配置文件变更时自动更新,无需重启应用:
using Apq.Cfg;
using Apq.Cfg.Changes;
using Microsoft.Extensions.Primitives;
// 构建配置(启用 reloadOnChange)
var cfg = new CfgBuilder()
.AddJson("appsettings.json", level: 0, writeable: false, reloadOnChange: true)
.AddJson("appsettings.local.json", level: 1, writeable: true, reloadOnChange: true)
.AddEnvironmentVariables(level: 2, prefix: "APP_")
.Build();
// 获取支持动态重载的 Microsoft Configuration
var msConfig = cfg.ToMicrosoftConfiguration(new DynamicReloadOptions
{
DebounceMs = 100, // 防抖时间窗口(毫秒)
EnableDynamicReload = true // 启用动态重载
});
// 方式1:使用 IChangeToken 监听变更
ChangeToken.OnChange(
() => msConfig.GetReloadToken(),
() => Console.WriteLine("配置已更新"));
// 方式2:使用 Rx 订阅配置变更事件
cfg.ConfigChanges.Subscribe(e =>
{
foreach (var (key, change) in e.Changes)
{
Console.WriteLine($"[{change.Type}] {key}: {change.OldValue} -> {change.NewValue}");
}
});
所有文件配置源(JSON、INI、XML、YAML、TOML)均支持智能编码处理:
编码映射:支持完整路径、通配符、正则表达式三种匹配方式
var cfg = new CfgBuilder()
// 为特定文件指定读取编码
.AddReadEncodingMapping(@"C:\legacy\old.ini", Encoding.GetEncoding("GB2312"))
// 为 PowerShell 脚本指定写入编码(UTF-8 BOM)
.AddWriteEncodingMappingWildcard("*.ps1", new UTF8Encoding(true))
// 设置编码检测置信度阈值(默认 0.6)
.WithEncodingConfidenceThreshold(0.7f)
// 启用编码检测日志
.WithEncodingDetectionLogging(result => Console.WriteLine($"检测到编码: {result}"))
.AddJson("config.json", level: 0, writeable: true)
.Build();
支持与 Microsoft.Extensions.DependencyInjection 无缝集成:
using Apq.Cfg;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
var services = new ServiceCollection();
// 注册 Apq.Cfg 配置
services.AddApqCfg(cfg => cfg
.AddJson("appsettings.json", level: 0, writeable: false)
.AddJson("appsettings.local.json", level: 1, writeable: true, isPrimaryWriter: true));
// 绑定强类型配置
services.ConfigureApqCfg<DatabaseOptions>("Database");
services.ConfigureApqCfg<LoggingOptions>("Logging");
var provider = services.BuildServiceProvider();
// 通过 DI 获取配置
var cfgRoot = provider.GetRequiredService<ICfgRoot>();
var dbOptions = provider.GetRequiredService<IOptions<DatabaseOptions>>().Value;
public class DatabaseOptions
{
public string? Host { get; set; }
public int Port { get; set; }
public string? Name { get; set; }
}
# 构建
dotnet build
# 运行单元测试
dotnet test
# 运行性能测试(需要管理员权限以获得准确结果)
cd benchmarks/Apq.Cfg.Benchmarks
dotnet run -c Release
最后运行时间: 2025-12-25
| 框架 | 通过 | 失败 | 跳过 | 总计 | 状态 |
|---|---|---|---|---|---|
| .NET 6.0 | 253 | 0 | 0 | 253 | ✅ 通过 |
| .NET 8.0 | 253 | 0 | 0 | 253 | ✅ 通过 |
| .NET 9.0 | 253 | 0 | 0 | 253 | ✅ 通过 |
详细测试覆盖情况见 tests/README.md
详细性能测试结果见 benchmarks/BENCHMARK_RESULTS.md
MIT License