.NET Learning Notes: 配置系统(Configuration)
references: youtube-yzk microsoft-configuration .NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖。 Json文件配置: 1.创建一个Json文件,文件名随意,比如config.json 2.NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json 3.编写代码,读取配置. (这里读的是程序运行的目录下的文件,而不是源代码中的文件) using Microsoft.Extensions.Configuration; ConfigurationBuilder configurationBuilder= new ConfigurationBuilder(); configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true); IConfigurationRoot configRoot = configurationBuilder.Build(); string name = configRoot["name"]; Console.WriteLine(name); string address = configRoot.GetSection("proxy:address").Value; Console.WriteLine(address); 绑定读取配置: 1.可以绑定一个类,自动完成配置的读取。 2.NuGet安装:Microsoft.Extensions.Configuration.Binder using Microsoft.Extensions.Configuration; ConfigurationBuilder configurationBuilder= new ConfigurationBuilder(); configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true); IConfigurationRoot configRoot = configurationBuilder.Build(); //也可以直接从root去get一个根结点的类,前提是这个泛型和json结构一致 Proxy proxy = configRoot.GetSection("proxy").Get(); Console.WriteLine($"{proxy.Address}, {proxy.Port}"); class Proxy { public string Address {get; set;} public int Port {get; set;} } 选项方式读取: 1.推荐使用选项方式读取,和DI结合更好,且更好利用reloadonchange机制 2.NuGet安装:Microsoft.Extensions.OPtions以及上面安装的其他三个拓展包 3.读取配置的时候,DI要声明IOptions、IOptionsMonitor , IOptionsSnapshot等类型. IOptions不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如一个request中)保持一致。建议使用IOptionsSnapshot。 using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; IServiceCollection services = new ServiceCollection(); ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true); IConfigurationRoot configRoot = configurationBuilder.Build(); // options 先添加到DI框架, IOptions{model}就可以被注入了。 // 然后把Config对象绑定到根节点上去,Configure(哪个对象绑定) services.AddOptions().Configure(e => configRoot.Bind(e)) .Configure(e => configRoot.GetSection("proxy").Bind(e)); services.AddScoped(); services.AddScoped(); using (var sp = services.BuildServiceProvider()) { while (true) { using (var scope = sp.CreateScope()) { // scope改变,snapshot就会改变配置 var c = scope.ServiceProvider.GetRequiredService(); c.Test(); // scope不变,snapshot就不会改变配置 var c2 = sp.GetRequiredService(); c2.Test(); } Console.WriteLine("press any button"); Console.ReadLine(); } } class Config { public string Name { get; set; } public int Age { get; set; } public Proxy Proxy { get; set; } } class Proxy { public string Address { get; set; } public int Port { get; set; } } using Microsoft.Extensions.Options; class TestController { private readonly IOptionsSnapshot optConfig; public TestController(IOptionsSnapshot optConfig) { this.optConfig = optConfig; } public void Test() { Console.WriteLine(optConfig.Value.Age); Console.WriteLine("********"); } } using Microsoft.Extensions.Options; class TestController2 { private readonly IOptionsSnapshot optConfig; public TestController2(IOptionsSnapshot optConfig) { this.optConfig = optConfig; } public void Test() { Console.WriteLine(optConfig.Value.Address); Console.WriteLine("********"); } } 除了JSON文件配置,还有其他配置方式: 命令行方式配置: 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 CommandLine方式的配置,在程序运行时就确定了,所以没有运行时改配置的问题。 对于{"A" : {"B": "b", "C": "c"}}这种结构,命令行配置没有直接的配置方式(key=value),可以采用扁平化配置。 1.对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于配置的名字需要采用层级配置。例如:a

references:
youtube-yzk
microsoft-configuration
.NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖。
Json文件配置:
1.创建一个Json文件,文件名随意,比如config.json
2.NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json
3.编写代码,读取配置. (这里读的是程序运行的目录下的文件,而不是源代码中的文件)
using Microsoft.Extensions.Configuration;
ConfigurationBuilder configurationBuilder= new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
IConfigurationRoot configRoot = configurationBuilder.Build();
string name = configRoot["name"];
Console.WriteLine(name);
string address = configRoot.GetSection("proxy:address").Value;
Console.WriteLine(address);
绑定读取配置:
1.可以绑定一个类,自动完成配置的读取。
2.NuGet安装:Microsoft.Extensions.Configuration.Binder
using Microsoft.Extensions.Configuration;
ConfigurationBuilder configurationBuilder= new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
IConfigurationRoot configRoot = configurationBuilder.Build();
//也可以直接从root去get一个根结点的类,前提是这个泛型和json结构一致
Proxy proxy = configRoot.GetSection("proxy").Get();
Console.WriteLine($"{proxy.Address}, {proxy.Port}");
class Proxy
{
public string Address {get; set;}
public int Port {get; set;}
}
选项方式读取:
1.推荐使用选项方式读取,和DI结合更好,且更好利用reloadonchange机制
2.NuGet安装:Microsoft.Extensions.OPtions以及上面安装的其他三个拓展包
3.读取配置的时候,DI要声明IOptions、IOptionsMonitor , IOptionsSnapshot等类型. IOptions不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如一个request中)保持一致。建议使用IOptionsSnapshot。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
IServiceCollection services = new ServiceCollection();
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: true);
IConfigurationRoot configRoot = configurationBuilder.Build();
// options 先添加到DI框架, IOptions{model}就可以被注入了。
// 然后把Config对象绑定到根节点上去,Configure<绑定的类型>(哪个对象绑定)
services.AddOptions().Configure(e => configRoot.Bind(e))
.Configure(e => configRoot.GetSection("proxy").Bind(e));
services.AddScoped();
services.AddScoped();
using (var sp = services.BuildServiceProvider())
{
while (true)
{
using (var scope = sp.CreateScope())
{
// scope改变,snapshot就会改变配置
var c = scope.ServiceProvider.GetRequiredService();
c.Test();
// scope不变,snapshot就不会改变配置
var c2 = sp.GetRequiredService();
c2.Test();
}
Console.WriteLine("press any button");
Console.ReadLine();
}
}
class Config
{
public string Name { get; set; }
public int Age { get; set; }
public Proxy Proxy { get; set; }
}
class Proxy
{
public string Address { get; set; }
public int Port { get; set; }
}
using Microsoft.Extensions.Options;
class TestController
{
private readonly IOptionsSnapshot optConfig;
public TestController(IOptionsSnapshot optConfig)
{
this.optConfig = optConfig;
}
public void Test()
{
Console.WriteLine(optConfig.Value.Age);
Console.WriteLine("********");
}
}
using Microsoft.Extensions.Options;
class TestController2
{
private readonly IOptionsSnapshot optConfig;
public TestController2(IOptionsSnapshot optConfig)
{
this.optConfig = optConfig;
}
public void Test()
{
Console.WriteLine(optConfig.Value.Address);
Console.WriteLine("********");
}
}
除了JSON文件配置,还有其他配置方式:
命令行方式配置:
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
CommandLine方式的配置,在程序运行时就确定了,所以没有运行时改配置的问题。
对于{"A" : {"B": "b", "C": "c"}}这种结构,命令行配置没有直接的配置方式(key=value),可以采用扁平化配置。
1.对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于配置的名字需要采用层级配置。例如:a