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

.NetCore配置文件-ConfigurationBuilder读取Json配置(一)

Nuget包安装

//ConfigurationBuilder 依赖:
Microsoft.Extensions.Configuration
//AddJsonFile 依赖:
Microsoft.Extensions.Configuration.Json 
//.Get<Configs>  依赖: 
Microsoft.Extensions.Configuration.Binder

读取方式(本次采用 控制台程序 演示)

在项目中添加JSON配置文件 config.json

{
  "name": "aaa--2",
  "AppSettings": {
    "SystemName": "我的网站---333333333"
  },
  "Domain": {
    "ImgUrl": "aaaa",
    "H5Url": "bbbb"
  },
  "Connections": [
    {
      "Key": "default",
      "Value": "Data Source=.,1433;Initial Catalog=xxx;Persist Security Info=True;User ID=sa;Password=123",
      "DbContext": "DataContext",
      "DBType": "SqlServer"
    }
  ]
}

1、传统的 手动读取配置

        /// <summary>
        /// 传统的 手动读取配置 
        /// 根节点:configRoot["name"]
        /// 二级节点:configRoot.GetSection("Domain:ImgUrl").Value;
        /// 列表节点:configRoot.GetSection("Connections:0:Value"); 
        /// </summary>
        public static void Read1()
        {
            //手动读取配置
            ConfigurationBuilder configBuilder = new ConfigurationBuilder();
            configBuilder.AddJsonFile("config.json",
                optional: false,//optional=false 的时候 如果无文件 会报错
                reloadOnChange: false);//reloadOnChange=如果文件修改了,重新加载配置
            IConfigurationRoot configRoot = configBuilder.Build();

            string name = configRoot["name"];

            string ImgUrl = configRoot.GetSection("Domain:ImgUrl").Value;
            string ImgUrl2 = configRoot["Domain:ImgUrl"];

            var ConnectionsValue = configRoot.GetSection("Connections:0:Value");
        }

2、绑定类读取配置

  • Configs.cs
     public class Configs
        {
            public string Name { get; set; }
            public Dictionary<string, string> AppSettings { get; set; }
    
            public List<ConfigConnection> Connections { get; set; }
    
            public ConfigDomain Domain { get; set; }
        }
    
        public class ConfigDomain
        {
            public string ImgUrl { get; set; }
            public string H5Url { get; set; }
        }
    
        public class ConfigConnection
        {
            public string Key { get; set; }
            public string Value { get; set; }
            public string DbContext { get; set; }
            public string DBType { get; set; }
        }
  • 读取配置
            /// <summary>
            /// 绑定类读取配置
            /// 绑定一个类,自动完成额配置的读取
            /// NuGet 安装:Microsoft.Extensions.Configuration.Binder
            /// 读取方式:
            /// 1、绑定整个json结构:configRoot.Get<Configs>()
            /// 2、绑定指定节点:configRoot.GetSection("Domain").Get<ConfigDomain>();// Domain 节点的
            /// 3、绑定列表节点:configRoot.GetSection("Connections").Get<List<ConfigConnection>>();//Connections 节点的
            /// </summary>
            public static void Binder()
            {
                ConfigurationBuilder configBuilder = new ConfigurationBuilder();
                configBuilder.AddJsonFile("config.json",
                    optional: false,//optional=false 的时候 如果无文件 会报错
                    reloadOnChange: false);//reloadOnChange=如果文件修改了,重新加载配置
                IConfigurationRoot configRoot = configBuilder.Build();
    
                var config = configRoot.Get<Configs>();//整个json结构
                var domain = configRoot.GetSection("Domain").Get<ConfigDomain>();// Domain 节点的
                var connections = configRoot.GetSection("Connections").Get<List<ConfigConnection>>();//Connections 节点的
    
            }

3、通过DI 注册服务(.net core Web应用 默认采用这种)

  • Program.cs
    ServiceCollection services = new ServiceCollection();
    services.AddScoped<HomeController>();
    //注册配置
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.AddJsonFile("config.json",
        optional: false,//optional=false 的时候 如果无文件 会报错
        reloadOnChange: true);//reloadOnChange=true 如果文件修改了,重新加载配置
    IConfigurationRoot configRoot = configBuilder.Build(); 
    //services.Configure<Configs>(e => configRoot.Bind(e)); 
    services.AddOptions().Configure<Configs>(e => configRoot.Bind(e));
    using (var sp = services.BuildServiceProvider())
        {
            while (true)
            {
                using (var scope = sp.CreateScope())
                {
                    var c = scope.ServiceProvider.GetRequiredService<HomeController>();
                    c.Index2(); 
                    Thread.Sleep(2000);
                }
            }  
        }
  • HomeController.cs
    public class HomeController
        {
            //单例,不支持数据变化(重启更新),性能高
            private readonly IOptions<Configs> _OptConfig;
            //单例,实时变更(侦听器OnChange) 
            private readonly IOptionsMonitor<Configs> _OptMonitorConfig;
            //作用域注册,单次请求内不变
            private readonly IOptionsSnapshot<Configs> _OptSnapshotConfig;
    
    
            private readonly IServiceProvider _ServiceProvider;
            public HomeController(IOptions<Configs> optConfig, IOptionsMonitor<Configs> optMonitorConfig, IOptionsSnapshot<Configs> optSnapshotConfig, IServiceProvider serviceProvider)
            {
                this._OptConfig = optConfig;
                this._OptMonitorConfig = optMonitorConfig;
                this._OptSnapshotConfig = optSnapshotConfig;
                this._ServiceProvider = serviceProvider;
            }
            public void Index2()
            {
                Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--_OptConfig_Name={_OptConfig.Value.Name}---{DateTime.Now.ToString("HH:ss")}");
    
                Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--Snapshot_Name={_OptSnapshotConfig.Value.Name}---{DateTime.Now.ToString("HH:ss")}");
    
                Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}]--Monitor_Name={_OptMonitorConfig.CurrentValue.Name}---{DateTime.Now.ToString("HH:ss")}");
    
                Console.WriteLine("\r\n");
                 
            }
         }

     

 

 

 

 

赞(2)