10分钟就能学会的.NET Core配置
.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件、命令行参数、环境变量等读取配置的方法。配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为POCO对象的支持。
目前支持以下配置Provider:
- 文件(INI,JSON,XML)
- 命令行参数
- 环境变量
- 内存中的.NET对象
- User Secrets
- Azure Key Vault
如果现有Provider不能满足你的使用场景,还允许自定义Provider,比如从数据库中读取。
配置相关的包
包管理器中搜索“Microsoft.Extensions.Configuration",所有与配置相关的包都会列举出来
从包的名称基本就可以看出它的用途,比如Microsoft.Extensions.Configuration.Json
是Json配置的Provider,Microsoft.Extensions.Configuration.CommandLine
是命令行参数配置的Provider,还有.NET Core程序中使用User Secrets存储敏感数据这篇文章中使用的Microsoft.Extensions.Configuration.UserSecrets
。
文件配置(以Json为例)
Json配置,需要安装Microsoft.Extensions.Configuration.Json
包。
命令行下安装执行以下命令
dotnet add package Microsoft.Extensions.Configuration.Json -v 1.1.2
调用AddJsonFile把Json配置的Provider添加到ConfigurationBuilder中。
class Program
{
public static IConfigurationRoot Configuration { get; set; }
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
}
如果使用Xml或Ini,只需安装相应的包,然后调用相应的扩展方法AddXmlFile("appsettings.xml)或AddIniFile("appsettings.ini")。
SetBasePath是指定从哪个目录开始查找appsettings.json。如果appsettings.json在configs目录中,那么调用AddJsonFile应该指定的路径为"configs/appsettings.json"。
下面是演示用的Json配置,后面会讲解所有读取它的方法
{
"AppId": "12345",
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"GrantTypes": [
{
"Name": "authorization_code"
},
{
"Name": "password"
},
{
"Name": "client_credentials"
}
]
}
读取JSON配置
1.使用Key读取
Configuration["AppId"]; // 结果 12345
Configuration["Logging:IncludeScopes"]; // 结果 false
Configuration["Logging:LogLevel:Default"]; // 结果 Debug
Configuration["GrantTypes:0:Name"]; // 结果 authorization_code
读取嵌套的配置,使用冒号隔开;读取数组形式的配置,使用数组的下标索引,0表示第一个。
如在其他地方用到Configuration的时候,可以通过构造函数注入IConfiguration。
首先配置IConfiguration的依赖
services.AddSingleton<IConfiguration>(Configuration);
然后在通过构造函数注入
private readonly IConfiguration _configuration;
public GetConfig(IConfiguration configuration)
{
_configuration = configuration;
}
2.使用GetValue<T>
这是一个扩展方法,使用它需要安装Microsoft.Extensions.Configuration.Binder
包。
Configuration.GetValue<int>("AppId", 12345); // 结果 12345
Configuration.GetValue<bool>("Logging:IncludeScopes", false); // 结果 false
Configuration.GetValue<string>("Logging:LogLevel:Default", "Debug"); // 结果 Debug
Configuration.GetValue<string>("GrantTypes:0:Name", "authorize_code"); // 结果 authorization_code
GetValue方法的泛型形式有两个重载,一个是GetValue("key"),另一个可以指定默认值,GetValue("key",defaultValue)。如果key的配置不存在,第一种的结果为default(T),第二种的结果则为指定的默认值。
3.使用Options
这种方式需要安装Microsoft.Extensions.Options.ConfigurationExtensions
包。
调用AddOptions()添加使用Options需要的服务。
services.AddOptions()
定义与配置对应的POCO类
public class MyOptions
{
public int AppId { get; set; }
public LoggingOptions Logging { get; set; }
public List<GrantType> GrantTypes { get; set; }
public class GrantType
{
public string Name { get; set; }
}
}
public class LoggingOptions
{
public bool IncludeScopes { get; set; }
public LogLevelOptions LogLevel { get; set; }
}
public class LogLevelOptions
{
public string Default { get; set; }
public string System { get; set; }
public string Microsoft { get; set; }
}
绑定整个配置到POCO对象上
services.Configure<MyOptions>(Configuration);
也可以绑定特定节点的配置
services.Configure<LoggingOptions>(Configuration.GetSection("Logging"));
或
services.Configure<LogLevelOptions>(Configuration.GetSection("Logging:LogLevel"));
在需要用到配置的地方,通过构造函数注入,或者直接使用ServiceProvider获取。
private readonly MyOptions _myOptions;
public GetConfig(IOptions<MyOptions> myOptionsAccessor)
{
_myOptions = myOptionsAccessor.Value;
}
或
var myOptionsAccessor = serviceProvider.GetService<IOptions<MyOptions>>();
var myOptions = myOptionsAccessor.Value;
4.使用Get<T>
Get<T>
是.NET Core 1.1才引入的。
var myOptions = Configuration.Get<MyOptions>();
或
var loggingOptions = Configuration.GetSection("Logging").Get<LoggingOptions>();
5.使用Bind
和Get<T>
类似,建议使用Get<T>
。
var myOptions = new MyOptions();
Configuration.Bind(myOptions);
或
var loggingOptions = new LoggingOptions();
Configuration.GetSection("Logging").Bind(loggingOptions);
文件变化自动重新加载配置
IOptionsSnapshot
支持配置文件变化自动重新加载配置。使用IOptionsSnapshot
也很简单,AddJsonFile有个重载,指定reloadOnChange:true即可。
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("configs/appsettings.json", optional: false, reloadOnChange: true);
内存中配置
内存中配置调用AddInMemoryCollection(),其余和Json配置一样。
var dict = new Dictionary<string, string>
{
{"AppId","12345"},
{"Logging:IncludeScopes","false"},
{"Logging:LogLevel:Default","Debug"},
{"Logging:LogLevel:System","Information"},
{"Logging:LogLevel:Microsoft","Information"},
{"GrantTypes:0:Name","authorization_code"},
{"GrantTypes:1:Name","password"},
{"GrantTypes:2:Name","client_credentials"}
};
var builder = new ConfigurationBuilder()
.AddInMemoryCollection(dict);
或
var builder = new ConfigurationBuilder()
.AddInMemoryCollection();
Configuration["AppId"] = "12345";
命令行参数配置
命令行参数配置需要安装Microsoft.Extensions.Configuration.CommandLine
包。
调用AddCommandLine()扩展方法将命令行配置Provider添加到ConfigurationBuilder中。
var builder = new ConfigurationBuilder()
.AddCommandLine(args);
传递参数有两种形式
dotnet run /AppId=12345
或
dotnet run --AppId 12345
如果为--AppId提供一个缩写的参数-a,那么执行dotnet run -a 12345
会报在switch mappings中没有-a定义的错误。
幸好AddCommandLine还有一个重载,可以传一个switch mapping。
var builder = new ConfigurationBuilder()
.AddCommandLine(args, new Dictionary<string, string>
{
{"-a","AppId"}
});
这样再运行下面的命令就不会报错了。
dotnet run -a 12345
环境变量配置
环境变量配置需要安装Microsoft.Extensions.Configuration.EnvironmentVariables
包。
调用AddEnvironmentVariables()扩展方法将环境变量配置Provider添加到ConfigurationBuilder中。
var builder = new ConfigurationBuilder()
.AddEnvironmentVariables();
获取所有的环境变量
Environment.GetEnvironmentVariables();
根据名称获取环境变量
Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
自定义配置Provider
自定义配置Provider需要继承IConfigurationSource实现自己的配置源,以及继承ConfigurationProvider,重写Load方法。
关于自定义配置Provider,我写了两个开源包,Cxlt.Extensions.Configuration.EF和Cxlt.Extensions.Configuration.Yaml,通过这两个项目,我会详细讲解如何实现自己的配置Provider。文章《实现自己的.NET Core配置Provider之EF》和《实现自己的.NET Core配置Provider之Yaml》过几天也会发布。
配置Provider顺序
.NET Core的配置API允许同时使用多个配置Provider。
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("configs/appsettings.json")
.AddXmlFile("configs/appsettings.xml")
.AddCommandLine(args)
.AddEnvironmentVariables();
如果两个Provider都有相同的配置,那么添加Provider的顺序就非常重要了,因为后加入的会覆盖前面的。
另外建议环境变量的配置Provider放到最后。
最后
.NET Core的配置是很基础的内容,学起来自然不难,基本上动手实践一遍就能掌握。越是简单的东西,在日后的开发中可能帮你节约很多时间。
如果这篇文章对你有帮助或有什么问题,欢迎关注“chengxulvtu"公众号。
10分钟就能学会的.NET Core配置的更多相关文章
- 【转】10分钟就能学会的.NET Core配置
.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...
- 10分钟 教你学会Linux/Unix下的vi文本编辑器
10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 教你10分钟对接人大金仓EF Core 6.x
前言 目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql.SqlSugar(排名不分先后).FreeSql和SqlS ...
- 10分钟 在linux里创建.net core helloworld控制台程序
官方教程 安装linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :选择和你本机适用的Linux版本,我这里用的是18.04. 第 ...
- 10分钟 Castle.Windsor 适配 Asp.Net Core 3.0
Asp.Net Core 3.0以上,不再能通过修改Starup.ConfigureServices返回值(IServiceProvider),所以只能调用IHostBuilder.UseServic ...
- 网站是HTTP?10分钟变成HTTPS!域名免费添加配置SSL证书,变成https//环境
对于小程序request请求需要https域名.navigator.geolocation定位也需要在https环境下才可以生效等问题: 前端开发越来越需要https环境来来测试一下API接口和各类问 ...
- UWP开发入门(十九)——10分钟学会在VS2015中使用Git
写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...
- Apache Shiro系列三,概述 —— 10分钟入门
一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...
随机推荐
- 计算进程消费cpu和内存
Linux下没有直接可以调用系统函数知道CPU占用和内存占用.那么如何知道CPU和内存信息呢.只有通过proc伪文件系统来实现. proc伪文件就不介绍了,只说其中4个文件.一个是/proc/stat ...
- 一个大数据平台省了20个IT人力——敦奴数据平台建设案例分享
认识敦奴 敦奴集团创立于1987年,主营服装.酒店.地产,总部位于中国皮都-海宁.浙江敦奴联合实业股份有限公司(以下简称"敦奴")是一家集开发.设计.生产.销售于一体的大型专业服装 ...
- loadrunner提高篇-场景设计实践
集合点设置 一.为什么要进行集合点设置? 因为在测试过程中,并不能保证所有的Vuser都在同一时刻进行操作,这样就达不到并发测试的目的,故需要用到集合点技术,集合点的意思是如果在一个操作之前设置了一个 ...
- Redis学习-Set
在Redis中,Set类型是没有排序的字符集合,和List类型一样,可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操 ...
- JavaScript之onXXXX事件和addEventListener的区别
JavaScript之onXXXX事件和addEventListener的区别 1.首先介绍两者的用法: 1.1onXXXX的用法:以onclick为例 第一种: obj.onclick = func ...
- yaf学习之——yaf安装
yaf的github源码地址 https://github.com/laruence/yaf 第一步: 下载dll扩展: http://pecl.php.net/package/yaf/2.3.5/w ...
- 【JAVAWEB学习笔记】19_事务
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- Linux parent process and child process when 'sudo'
如果在一般用户下如user,执行sudo命令,会产生两个进程. ps -ef | grep Container root 4305 643 0 16:37 pts/39 00:00:00 sudo . ...
- ArrayList源码解析(二)自动扩容机制与add操作
本篇主要分析ArrayList的自动扩容机制,add和remove的相关方法. 作为一个list,add和remove操作自然是必须的. 前面说过,ArrayList底层是使用Object数组实现的. ...
- 如何在Elasticsearch中安装中文分词器(IK)和拼音分词器?
声明:我使用的Elasticsearch的版本是5.4.0,安装分词器前请先安装maven 一:安装maven https://github.com/apache/maven 说明: 安装maven需 ...