.NET Core 配置系统使用

184 阅读3分钟

user-secrets

user-secrets的配置不会放到源代码中,是一个json文件。在csproj的配置中自动生成的UserSecretsId节点即文件的名字

注意,并不是生产中的加密,只适用于开发

使用步骤:

//Nuget

Microsoft.Extensions.Configuration.UserSecrets

1、在VS项目上点右键【管理用户机密】,编辑这个配置文件

2、将配置源注册到ConfigurationBuilder

configBuilder.AddUserSecrets<Program>();

注意

1)不能泄漏到源码中的配置放到user-secrets即可,不用都放

2)一般把user-secrets优先级放到普通json文件之后

3)如果开发人员电脑重装系统等原因造成本地的配置文件删除了,就需要重新配置

4)并不是生产中的加密,只适用于开发

从命令行读取配置

Microsoft.Extensions.Configuration.CommandLine

configBuilder.AddCommandLine(args)

命令行输入参数值的方式

//支持多种格式,注意格式不能混用
server=127.0.0.1(推荐)
--server=127.0.0.1
--serve 127.0.0.1(中间加空格)
/server=127.0.0.1
/server 127.0.0.1(中间加空格)

1)简单结构,直接输入即可

a.exe name=ywl age=8

2)对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置(如数组、对象),需要进行“扁平化处理”,即对于配置的名字需要采用“层级配置"

proxy:address=aaa //proxy的address属性的值
proxy:id:0=3 proxy:id:1=5    //proxy的id数组的第0、1个元素的值

vs中简化传值

项目--属性--调试--打开调试启动配置文件UI--命令行参数/环境变量,输入即可

name=ywl age=8

注意,仅供开发,生产模式时仍需要配置真正的环境变量,且也需要扁平化配置

从环境变量读取配置

Microsoft.Extensions.Configuration.EnvironmentVariables

参数是可选的,建议加上环境变量的前缀,实际的属性不需要加前缀

AddEnvironmentVariables("C1_")

Zack 库从数据库中读取配置

Zack.AnyDBConfigProvider说明:

  • 默认表的名字是T_Configs
  • 如果Name有重名的,按照id为最大的配置
  • 可以识别json是因为将json拆分为扁平化结构
  • 有读写锁,允许并发读,不允许并发写

Zack.AnyDBConfigProvider作用:从任意关系数据库中加载配置的ConfigurationProvider,支持的数据库包括但不限于SQLServer, MySQL,PostgreSQL, Oracle等

Zack.AnyDBConfigProvider //第三方库

System.Data.SqlClient //这个是给.net core用的

1、在数据库中建张表T_Configs,表必须有Id、Name、Value三个列,Id定义为整数(bigint)、自动增长列。Name和Value都定义为字符串类型列nvarchar(MAX),然后放扁平化的数据。

//可以是key为扁平化结构,value为普通值
Api:Jwt:Audience
Age
Api:Names:0
Api:Names:1

//可以是key为普通值,value是json数组、json对象
["a","d"]
{"Secret": "afd3","Issuer": "youzack","Ids":[3,5,8]} 
ffff
3

2、配置插件向什么数据库取信息

ConfigurationBuilder configBuilder=new ConfigurationBuilder();
string connstr=...;
//reloadOnChange是否配置改变立即刷新(通过死循环实现)
//reloadInterval隔多少秒加载一次
configBuilder.AddDbConfiguration(() => new SqlConnection(connStr),
                                 reloadOnChange:true,reloadInterval:TimeSpan.FromSeconds(2));
IConfigurationRoot configRoot=configBuilder.Build();

3、按照标准的.NET 中读取配置的方法去读取