.NET CORE配置入门
1.传统Web.config配置的缺点,之前DI讲到过
2.为了兼容,仍然可以使用Web.config和ConfigurationManager类,但不推荐
3…NET中的配置系统支持丰富的配置源,包括文件(json,xml,ini等),注册表,环境变量,命令行,Azure Key Vault等,还可以配置自定义配置源,可以跟踪的改变,可以按照优先级覆盖.
一.读取Json文件配置
{
"name": "mcg",
"age": "18",
"proxy": {"address": "aa","port": "80" }
}
1.创建一个json文件,文件名随意,比如config.json,设置"如果较新则复制".参考备注
2.NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json
3.编写代码,先用简单的方式读取配置
static void Main(string[] args)
{
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
IConfigurationRoot configRoot = configBuilder.Build();
string name = configRoot["name"];
Console.WriteLine($"name={name}");
string add = configRoot.GetSection("proxy:address").Value;
Console.WriteLine($"addr={add}");
Console.ReadKey();
}
optional参数表示这个文件是否可选,初学时,建议optional设为false,这样写错了的话能够及时发现.
readOnChange参数表示如果文件修改了,是否重现加载配置
1.绑定读取配置
1)可以绑定一个类,自动完成配置的读取
2)NuGet安装:Microsoft.Extensions.Configuration.Binder
3)Server server = configRoot.GetSection(“proxy”).Get();
class Proxy
{
public string Address { get; set; }
public int Port { get; set; }
}
static void Main(string[] args)
{
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
IConfigurationRoot configRoot = configBuilder.Build();
Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.Address},{proxy.Port}");
Console.ReadKey();
}
2.选项方式读取配置
1.推荐使用选项方式读取,和DI结合更好,且更好利用"reloadonchange"机制
2.NuGet安装:
Microsoft.Extensions.Options
Microsoft.Extensions.Binder
当然也需要Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
3.读取配置的时候,DI要声明IOptions,IOptionMonitor,IOptionsSnapshot等类型.IOptions不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如ASP.NET Core一个请求中)保持一致.建议用IOptionsSnapshot.
4.演示代码
class Config
{
public string Name { get; set; }
public int Age { get; set; }
public Proxy Proxy{ get; set; }
}
class TestController
{
//private readonly Config OptConfig;
public IOptionsSnapshot<Config> optConfig;
public TestController(IOptionsSnapshot<Config> optConfig)
{
this.optConfig = optConfig;
}
public void Test()
{
Console.WriteLine(optConfig.Value.Age);
Console.WriteLine("----------------");
Console.WriteLine(optConfig.Value.Age);
}
}
class Test2
{
private readonly IOptionsSnapshot<Proxy> optProxy;
public Test2(IOptionsSnapshot<Proxy> optProxy)
{
this.optProxy = optProxy;
}
public void Test()
{
Console.WriteLine(optProxy.Value.Address);
}
}
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<TestController>();
services.AddScoped<Test2>();
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
IConfigurationRoot configRoot = configBuilder.Build();
services.AddOptions().Configure<Config>(e => configRoot.Bind(e))
.Configure<Proxy>(e=>configRoot.GetSection("proxy").Bind(e));
using (var sp = services.BuildServiceProvider())
{
var c = sp.GetRequiredService<TestController>();
c.Test();
var c2 = sp.GetRequiredService<Test2>();
c2.Test();
}
Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.Address},{proxy.Port}");
Console.ReadKey();
}
}
3.命令行方式配置
1.配置框架还支持从命令行参数,环境变量等地方读取
2.NuGet安装
Microsoft.Extensions.Configuration.CommandLine
3.configBuilder.AddCommandLine(args)
4.参数支持多种格式,比如: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(注意在键值之间加空格).格式不能混用
5.调试的时候,vs中简化命令行参数的方法
4.扁平化配置
1.对于环境变量,命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行"扁平化处理".对于配置的名字需要采用"层级配置".
例如: a : b : c,对于数字这样配置 a :b : c:0,a :b : c:1,a :b : c:2
2.这个知识点在自定义配置Provider中还会用到
5.环境变量配置
1.NuGet安装
Microsoft.Extensions.Configuration.EnvironmentVariables
2.然后configurationBuilder.AddEnvironmentVariables()
AddEnvironmentVariables()有无参数和有prefix参数的两个重载版本.无参数版本会把程序相关的所有环境变量都加载进来,由于有可能和系统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables().读取配置的时候,prefix参数会被忽略.
3.vs中调试时,避免修改系统环境变量,直接在vs中设置环境变量的方法
6.其他配置源
1.还支持ini,xml等格式的配置源,如果想用查询文档即可.
2.还支持在运行时,调试时加载不同的Json文件;
统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables().读取配置的时候,prefix参数会被忽略.
3.vs中调试时,避免修改系统环境变量,直接在vs中设置环境变量的方法
6.其他配置源
1.还支持ini,xml等格式的配置源,如果想用查询文档即可.
2.还支持在运行时,调试时加载不同的Json文件;
3.还内置或者第三方支持中心化配置的服务器,比如使用Apollo,Nacos等开源服务器,或者使用Azure,阿里云等的配置服务.具体看文档即可