.Net Core——配置系统

  • Post author:
  • Post category:其他


本文章是我听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、并不是生产中的加秘密,只适用于开发



版权声明:本文为weixin_45756851原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。