.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.Binder
public 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上面去了,这样的话,依赖注入会自动注入到MyConfig
sc.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:1
static void Main(string[] args)
{
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.AddCommandLine(args);
//cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
//后面步骤参考json部分
}
环境变量方式配置
安装
Microsoft.Extensions.Configuration.EnvironmentVariables
AddEnvironmentVariables()
有两个重构,一个无参一个有一个prefix参数。无参数的是所有环境变量都加载进来。prefix参数,只加载带有这个前缀的环境变量。static void Main(string[] args)
{
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.AddEnvironmentVariables();
//cb.AddJsonFile(path: "config.json", optional: true, reloadOnChange: true);
//后面步骤参考json部分
}
多配置源覆盖优先级
按照注册到ConfigurationBuilder的顺序,后注册的优先级高。同名的配置,用后注册的值。