.NET中的配置系统支持丰富的配置源,包括文件(json,xml,ini等),注册表,环境变量,命令行,服务器等。还可以自定义配置源。可以跟踪配置的改变,可以按优先级覆盖。
安装包:Microsoft.Extensions.Configuration
读取本地Json配置
在项目中建一个json文件后,要把它的属性改成始终复制或者较新复制。
然后安装包Microsoft.Extensions.Configuration.Json
{"name": "张三","age": 18,"info": {"ids": [12,34,56],"subject": {"name": "语文","page": 167}}}
基础用法
static void Main(string[] args){ConfigurationBuilder cb = new ConfigurationBuilder();//optional:文件是否可选,true没有文件也不报错,false没有这个文件直接抛出异常//reloadOnChange:true热加载cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);IConfigurationRoot config = cb.Build();string name = config["name"];Console.WriteLine(name);string page = config["info:subject:page"];Console.WriteLine(page);}
绑定读取配置
- 可以绑定一个类,自动完成配置的读取
- 安装:
Microsoft.Extensions.Configuration.Binderpublic class MyConfig{public string Name { get; set; }public int Age { get; set; }public Info Info { get; set; }}public class Info{public int[] Ids { get; set; }public Subject Subject { get; set; }}public class Subject{public string Name { get; set; }public int Page { get; set; }}
static void Main(string[] args){ConfigurationBuilder cb = new ConfigurationBuilder();//optional:文件是否可选,true没有文件也不报错,false没有这个文件直接抛出异常//reloadOnChange:true热加载cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);IConfigurationRoot config = cb.Build();MyConfig mconfig = config.Get<MyConfig>();}
Options依赖注入
下载:Microsoft.Extensions.Options
读取配置的时候,DI要声明IOptions,IOptionsMonitor ,IOptionsSnapshot 等类型。
- IOptions
:程序运行过程中,如果配置文件改变了,不会读取新的值 - IOptionsMonitor
:配置文件改变了,马上更改。 IOptionsSnapshot
:在同一个范围内(比如ASP.NET一个请求中)保持一致。建议用这个。 public class Controller{private readonly IOptionsSnapshot<MyConfig> config;public Controller(IOptionsSnapshot<MyConfig> config){this.config = config;}public void test(){Console.WriteLine(config.Value.Name);Console.WriteLine(config.Value.Info.Subject.Name);}}
static void Main(string[] args){ConfigurationBuilder cb = new ConfigurationBuilder();cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);IConfigurationRoot config = cb.Build();ServiceCollection sc = new ServiceCollection();//意思是把MyConfig对象绑定到根节点config上面去了,这样的话,依赖注入会自动注入到MyConfigsc.AddOptions().Configure<MyConfig>(e => config.Bind(e));//如果配置内容很多,只想要其中一部分,//sc.AddOptions().Configure<Subject>(e => config.GetSection("info:subject").Bind(e));sc.AddScoped<Controller>();var controller = sc.BuildServiceProvider().GetRequiredService<Controller>();controller.test();}
命令行方式配置
- 安装
Microsoft.Extensions.Configuration.CommandLine configBuilder.AddCommandLine(args)- 参数支持多种格式,比如
server=127.0.0.1,--server=127.0.0.1,--server 127.0.0.1,/server=127.0.0.1,/server 127.0.0.1 - 格式不能混用
- 多个值之间用空格分割
对于环境变量,命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于配置的名字需要采用“层级配置”,例如:
a:b:c。对于数字这样的配置:a:b:c:0,a:b:c:1static void Main(string[] args){ConfigurationBuilder cb = new ConfigurationBuilder();cb.AddCommandLine(args);//cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);//后面步骤参考json部分}
环境变量方式配置
安装
Microsoft.Extensions.Configuration.EnvironmentVariablesAddEnvironmentVariables()有两个重构,一个无参一个有一个prefix参数。无参数的是所有环境变量都加载进来。prefix参数,只加载带有这个前缀的环境变量。static void Main(string[] args){ConfigurationBuilder cb = new ConfigurationBuilder();cb.AddEnvironmentVariables();//cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);//后面步骤参考json部分}
多配置源覆盖优先级
按照注册到ConfigurationBuilder的顺序,后注册的优先级高。同名的配置,用后注册的值。
