.NET Core中的配置系统
传统配置方式
- 文件Web.config 进行配置。
- ConfigurationManager类配置。
.NET配置系统中支持配置方式
- 文件配置(json、xml、ini等)
- 注册表
- 环境变量
- 命令行
- 自定义配置源
Json文件配置方式
实现步骤:
- 创建一个json文件,把文件设置 为“如果较新则复制”,这样编译后的文件会复制一份到bin目录下。
{"name": "wangxiaohua","exclude": ["**/bin","**/bower_components","**/jspm_packages","**/node_modules","**/obj","**/platforms"],"proxy":{"key": "value","age": 88} }
- Nuget安装
- Microsoft.Extensions.Configuration 配置框架基础包
- Microsoft.Extensions.Configuration.Json 读取json配置文件包
- 编写代码读取配置。
namespace ConsoleApp1 {internal class Program{static void Main(string[] args){//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();string name = confRoot["name"];Console.WriteLine($"name={name}");string value =confRoot.GetSection("proxy:key").Value;Console.WriteLine($"value={value}");Console.ReadKey();}} }
对象映射方式读取json文件
例如:
将配置内容映射成对象
{
“name”:"wangwu",
"age":99,
"proxy":{"address":"192.168.0.1","port":"80"}}
创建一个类文件,属性和配置文件中key相对应
//把整个配置文件映射成一个对象
class Config { public string Name { get; set; }public int Age { get; set; }public Proxy Proxy { get; set; }}//将proxy中的内容映射成一个类class Proxy { public string Address { get; set; }public string Port { get; set; }}
读取映射类,读取之前需要先安装NuGet包:Microsoft.Extensions.Configuration.Binder
namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();Config config =confRoot.Get<Config>();//获取配置文件中name的值Console.WriteLine(config.Name);//获取配置文件中port的值Console.WriteLine(config.Proxy.port)//读取指定对象Porxy porxy =confRoot.GetSection("porxy").Get<Porxy>();}}
}
使用选项方式读取配置文件(推荐)
首先需要安装Nuget包:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Options
然后再读取配置文件时候,需要使用到DI注入IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>类型。
IOptions<T>不会读取到更新的值
IOptionsSnapshot<T> 在一定的范围内读取的是原来的值
IOptionsMonitor<T> 立即读取到更新值
创建一个类文件:在这个文件中注入IOptionsSnapshot<T> 接口
class OptionsConfig
{//声明IOptionsSnapshot private readonly IOptionsSnapshot<Config> options;//使用构造方法方式进行注入public OptionsConfig(IOptionsSnapshot<Config> options) { this.options = options;}public void Test() {Config config =options.Value;Console.WriteLine(config.Name);}}
在使用读取配置文件
static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
命令行方式进行配置:
需要安装包:Microsoft.Extensions.Configuration.CommandLine
static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原来添加读取JSON文件更换成命令行------------------builder.AddCommandLine(args); //----------------------------------//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
使用时候就是在cmd窗口中使用,应用程序加参数方式。
调试时可以直接在IDE进行传递参数:
在项目上右键鼠标选择“属性”
在选择“调试” --》“启动配置文件”
直接在命令行参数中填写需要传递的参数
参数的扁平化配置(扁平就是把每个参数都展开)
如果在命令行中传递的不是简单是键值对,是比较复杂的对象或数组
对象属性传参格式:
类名:属性名=值
对象的数组传参格式:
类名:属性名:数组下标 = 值
class Proxy { public string Address { get; set; }public string Port { get; set; }public int[] Ids {get;set;}}
比如上面的模型类是一个对象,对象中还有数组,在命令行中就需要使用到扁平化传参数。
传递参数应该是:
环境变量读取参数配置
1.首先也是需要安装Nuget包:
Microsoft.Extensions.Configuration.EnvironmentVariables
2.然后调用环境变量参数函数:configurationBuilder.AddEnvironmentVariables(),这个函数有无参数和有参数prefix参数重载版本。建议调用prefix版本(带前缀区别环境变量),加载参数时候会忽略prefix参数不会和系统配置环境变量冲突。
static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原来添加读取JSON文件更换成环境变量配置方式------------------//----------------------------环境变量配置方式-------------------------------builder.AddEnvironmentVariables();//----------------------------------//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}
3.设置环境变量键值对:
ide调试参数配置:
部署环境,需要在 ”我的电脑” --》属性--》高级--》环境变量中进行配置
开发自定义配置步骤
1.自己开发类需要实现IConfigurationProvider接口
实现 IConfigurationProvider的类有 ConfigurationProvider 和FileConfigurationProvider,重写Load方法,把数据扁平化设置到Data属性中即可。
2.在开发一个实现IConfigurationSource接口的类。读取文件可以继承类 FileConfigurationSource在重写Build方法中返回上面的ConfigurationProvider对象。
3.然后把ConfigurationSource对象加入到IConfigurationBuilder中 ,configurationBuilder.Add(new ConfigurationSource())