加载自定义的配置文件
- 默认情况下,.NET Core 应用程序使用
appsettings.json 文件来存储配置信息,但是有时我们需要加载自定义的配置文件
- .NET Core 提供了
ConfigurationBuilder 类来加载和管理配置信息。ConfigurationBuilder 类允许我们加载多个配置文件,并将它们合并为一个 IConfiguration 对象
一、加载 指定的 json配置 (Program.cs)
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureAppConfiguration((hostContext, configurationBuilder) =>
{
//加载 指定的 json配置
configurationBuilder.AddJsonFile("Configuration/Database.json", optional: true, reloadOnChange: true);
});
二、根据配置 自动扫描多个 json配置
- Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureAppConfiguration((hostContext, configurationBuilder) =>
{
//批量加载多个 json配置
AppConfiguration.AddJsonFiles(configurationBuilder);
});
- AppConfiguration.cs
public static class AppConfiguration
{
/// <summary>
/// 排除的配置文件前缀
/// </summary>
private static readonly string[] excludeJsonPrefixs = new[] { "appsettings", "bundleconfig", "compilerconfig" };
/// <summary>
/// 排除运行时 Json 后缀
/// </summary>
private static readonly string[] runtimeJsonSuffixs = new[]
{
"deps.json",
"runtimeconfig.dev.json",
"runtimeconfig.prod.json",
"runtimeconfig.json",
"staticwebassets.runtime.json"
};
/// <summary>
/// 加载所有的自定义json 配置文件
/// </summary>
/// <param name="configurationBuilder"></param>
public static void AddJsonFiles(IConfigurationBuilder configurationBuilder)
{
// 获取根配置
var configuration = configurationBuilder.Build();
// 获取程序执行目录 G:\bin\Debug\net6.0\
var executeDirectory = AppContext.BaseDirectory;
// 获取自定义配置扫描目录,并设置完整的路径返回
var configurationScanDirectories = (configuration.GetSection("ConfigurationScanDirectories").Get<string[]>() ?? Array.Empty<string>()).Select(u => Path.Combine(executeDirectory, u));
// 扫描执行目录及自定义配置目录下的 *.json 文件
var jsonFiles = new[] { executeDirectory }.Concat(configurationScanDirectories)
.SelectMany(u => Directory.GetFiles(u, "*.json", SearchOption.TopDirectoryOnly));
// 如果没有配置文件,中止执行
if (!jsonFiles.Any()) return;
// 将所有文件进行 前缀,后缀的筛选
var files = jsonFiles.Where(file => !excludeJsonPrefixs.Any(c => Path.GetFileName(file).StartsWith(c))).Where(file => !runtimeJsonSuffixs.Any(c => file.EndsWith(c)));
// 循环加载
foreach (var jsonFile in files)
{
configurationBuilder.AddJsonFile(jsonFile, optional: true, reloadOnChange: true);
}
}
}
- appsettings.json
{
"ConfigurationScanDirectories": [ "Configuration", "Configuration3" ]// 扫描配置文件json文件夹(自动合并该文件夹里面所有json文件)
}
}
- 控制器(DemoController.cs)
/// <summary>
/// 获取 所有 Json 配置 信息
/// </summary>
/// <param name="configuration"></param>
/// <returns></returns>
[HttpGet]
public Dictionary<string, Dictionary<string, string>> GetJsonConfigurationList([FromServices] IConfiguration configuration)
{
Dictionary<string, Dictionary<string, string>> kvList = new Dictionary<string, Dictionary<string, string>>();
var configurationRoot = (IConfigurationRoot)configuration;
var providersList = configurationRoot.Providers;
foreach (var item in providersList)
{
var typeName = item.GetType().Name;
if (item is JsonConfigurationProvider fileProvider)
{
//通过反射 读取保护属性(Data)属性
var dataField = fileProvider.GetType().GetProperty("Data", BindingFlags.NonPublic | BindingFlags.Instance);
var data = (Dictionary<string, string>)dataField.GetValue(fileProvider);
var source = fileProvider.Source;
kvList.Add(source.Path, data);
}
}
return kvList;
}
/// <summary>
/// 获取configuration中所有的键值对
/// </summary>
[HttpGet]
public dynamic GetConfigurationList([FromServices] IConfiguration configuration)
{
var kvList = configuration.AsEnumerable().ToList();
return kvList;
}
读取自定义配置文件和读取 appsettings.json 一致,请参考
.Net Core 读取配置文件的几种方式(Configuration)