欢迎光临
个人技术文档整理

.Net Core 加载自定义配置文件(ConfigurationBuilder )

加载自定义的配置文件

  • 默认情况下,.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)

赞(1)