本文章是我听B站杨中科的所做的笔记
杨中科B站视频链接:
.NET 6教程,.Net Core 2022视频教程,杨中科主讲_哔哩哔哩_bilibili
1、说明
.net中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖
Json文件配置
1、创建一个json文件,文件名随意,比如config.json,设置“如果较新则复制”
2、NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile(
"config.json", optional: false, reloadOnChange: false);
IConfigurationRoot config = configBuilder.Build();
string name = config["name"];
string proxyAddress = config.GetSection("proxy:address").Value;
optional参数表示这个文件是否可选。初学时,建议optional设置为true,意思是文件不存在报错,这样写错了的话能够及时发现 reloadOnChange参数表示如果文件修改了,是否重新加载配置
绑定读取配置
1、可以绑定一个类,自动完成配置的读取
2、NuGet安装:Microsoft.Extensions.Configuration.Binder
Server server = configRoot.GetSection("proxy").Get<Server>()
2、选项方法读取
1、推荐使用选项方式读取,和DI结合更好,且更好利用“reloadonchange”机制
2、NuGet安装:Microsoft.Extensions.Option、Microsoft.Extensions.Configuration.Binder,当然也需要Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json。
3、读取配置的时候,DI要声明IOptions<s>、IOptionsMonitor<T>、IOptionsSnapshot<T>。IOptions<T>不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如ASP.NET Core一个请求)保持一致。建议用IOptionsSnapshot
演示
1、在读取配置的地方,用IOptionsSnapshot<T>注入。不要在构造函数里直接读取IOptionsSnapshot.value,而是到用到的地方在读取,否则就无法更新变化了
2、如下配置
services.AddOptions()
.Configure<DbSettings>(e => config.GetSection("DB").Bind(e))
.Configure<SmtpSettings>(e => config.GetSection("Smtp").Bind(e));
services.AddTransient<Demo>();//不能用Singleton
试验改变
using (var sp = services.BuildServiceProvider())
{
while (true)
{
using (var scope = sp.CreateScope())
{
var spScope = scope.ServiceProvider;
var demo = spScope.GetService<Demo>();
demo.Test();
}
Console.WriteLine("可以改配置啦");
Console.ReadKey();
}
}
3、其他配置提供者
1、命令行方式配置
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中简化命令行传参的方法
2、扁平化配置
3、环境变量配置
4、其他配置源ini、xml、Azure、阿里云等配置服务
4、开发自己的配置提供者
5、开发数据库配置提供者
项目需求:网站用集群部署,如果用本地配置文件,每次修改都要挨个修改。有Apollo、Nacos等开源的配置中心以及云服务平台的配置服务,但是项目对于配置的要求没有非常复复杂,因此决定在关系数据库中保存配置
已经开源:
https://github.com/yangzhongke/Zack.AnyDBConfigProvider
用的是扁平结构
6、多配置源的优先级
为什么要多配置源?
1、比如:某个网站需要自定义配置;程序员的同一台机器上,开发调式环境和测试环境用不同的配置
2、按照注册到ConfigurationBuilder的顺序,“后来者居上”,后注册的优先级高,如果配置名字重复,用后注册的值
7、保命的UserSecrets
1、.NET提供了user-secrets机制,user-secrets的配置不放到源码中
2、Nuget安装:Microsoft.Extensions.Configuration.UserSecrets
3、在vs项目上点击右键【管理用户机密】,编辑这个配置文件。看看这个文件在哪里。会自动在csproj中的UserSecretsId就是文件夹的名字
4、configBuilder.AddUserSecrets<Program>()
8、注意
1、不能泄露到源码中的配置放到user-secrets即可,不用都放
2、一般把user-secrets优先级放到普通json文件之后
3、如果开发人员电脑重装系统等原因造成本地的配置文件删除了,就需要重新配置
4、并不是生产中的加秘密,只适用于开发