ASP.NET Core 2.2 : 二十二. 多样性的配置方式
大多数应用都离不开配置,本章将介绍ASP.NET Core中常见的几种配置方式及系统内部实现的机制。(ASP.NET Core 系列目录)
说到配置,第一印象可能就是“.config”类型的xml文件或者“.ini”类型的ini文件,在ASP.NET Core 中,常用的配置文件类型为JSON。比如项目根目录中的appsettings.json和appsettings.Development.json两个文件。实际上,ASP.NET Core支持多种配置方式,除了采用JSON文件的方式外,还支持内存、命令行等方式。
一、文件方式
这是最常见的方式,ASP.NET Core支持多种格式的配置文件,例如常见的JSON、XML、INI等格式的文件。
首先看一下项目默认创建的配置文件appsettings.json,其内容默认如下:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
这个文件会在系统启动的时候自动被加载(加载发生在Program文件的CreateWebHostBuilder方法中,下一节会详细说明),默认内容主要是对Log的配置。
举个例子,需要在配置文件中设置应用的主题,例如颜色风格等。向文件末尾添加如下内容:
"Theme": {
"Name": "Blue",
"Color": "#0921DC"
}
用通过这样的代码设置了系统的主题和对应的色值。那么这个值是如何被获取并使用的呢?以默认的HomeController为例,新建一个名为“GetConfiguration”的Action来演示Configuration值的获取。代码如下:
privatereadonlyIConfiguration _configuration;
publicHomeController(IConfiguration configuration)
{
_configuration = configuration;
} publicContentResult GetConfiguration()
{
returnnewContentResult() { Content = $"Theme Name:{ _configuration["Theme:Name"] },Color:{_configuration["Theme:Color"]}"};
}
在构造方法中通过依赖注入的方式获取到了一个IConfiguration,并在Action中通过这个IConfiguration获取到了appsettings.json中设置的值。可以看出,在获取值的时候,是通过“:”符号来体现JSON的层级关系体现的。例如获取“Color”的值,对应的表达式为“_configuration["Theme:Color"]”。这是因为整个JSON会被处理为一个个的Key-Value的格式,本例的“Theme”的两个值会被分解为如下格式:
|
Key |
Value |
|
Theme:Name |
Blue |
|
Theme:Color |
#0921DC |
这里有两个说明,第一,“Key”不区分大小写,即写为“theme:color”也是等效的;第二,约定“Value”值是字符串格式。
除了上例中的获取方式,还可以通过GetValue方法获取。
_configuration.GetValue<string>("Theme:Color","#000000")
含义是将获取到的值转换为string类型,如果获取失败则返回默认值“#000000”。
本例演示了系统默认的appsettings.json文件中的内容被自动载入,那么如何将自定义的JSON文件中的内容应用到系统的配置中去呢?
新建一个名为“Theme.json”的文件,同样再预设一个红色主题,代码如下:
{
"Theme": {
"Name": "Red",
"Color": "#FF4500"
}
}
由于这个自定义的“Theme.json”不会被自动载入,需要手动将其添加到系统的配置中去,在讲应用系统的启动的时候说过,配置是在Program文件的CreateDefaultBuilder方法中被加载的,可以在其之后继续通过ConfigureAppConfiguration方法继续设置。例如如下代码:
publicstaticIWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext,config)=> {
config.SetBasePath(Directory.GetCurrentDirectory());
varpath = Path.Combine(Directory.GetCurrentDirectory(), "Theme.json");
config.AddJsonFile(path, optional: false, reloadOnChange: true);
})
.UseStartup<Startup>();
}
首先通过SetBasePath方法设置了基路径,然后通过AddJsonFile方法添加“Theme.json”文件,这个方法有3个参数,第一个是“Theme.json”所在的位置,第二个设置此文件是否可选,第三个设置当此文件被修改后,是否自动重新加载该文件。
再次访问home/GetConfiguration,返回的结果如下:
Theme Name:Red,Color:#FF4500
这是因为后添加的Theme.json文件中的Theme值覆盖了appsettings.json文件中的Theme值。这涉及到各种配置设置方式的优先级问题,在下一节会讲。
说完了将JSON格式的文件用作配置的例子,再看看如何采用INI格式的。新建一个名为Theme.ini的文件,为了不覆盖之前设置的Theme,本例将Theme改为了ThemeGreen。
[ThemeGreen]
Name=Green
Color=#76EE00
通过ConfigureAppConfiguration方法将这个INI文件添加到配置中去。
var pathIni = Path.Combine(Directory.GetCurrentDirectory(), "Theme.ini");
config.AddIniFile(pathIni, optional: false, reloadOnChange: true);
修改Action中读取配置的Key,将对应的将Theme改为ThemeGreen:
publicContentResult GetConfiguration()
{
returnnewContentResult() { Content = $"Theme Name:{ _configuration["ThemeGreen:Name"] },Color:{_configuration.GetValue<string>("ThemeGreen:Color", "#")}"};
}
再次访问home/GetConfiguration,返回的结果如下:
Theme Name:Green,Color:#76EE00
上面介绍了JSON和INI两种格式的文件的应用,除了二者文件格式的不同以及被添加到配置时采用的方法不同(分别采用了AddJsonFile和AddIniFile方法),在其他环节二者的使用方式均是一样的。同理,对于XML格式的文件,有一个对应的AddXmlFile方法,其他环节和JSON、INI文件的应用也是一样的,此处就不再举例描述。
二、目录文件
除了上一节利用JSON、INI和XML这样常用的文件格式外,还可以将指定目录和文件作为配置的数据来源。
例如现在有个文件夹s,其下面有1.txt和2.txt两个文件,文件内容分别是s1和s2,如下图1

图1
可以将这一的目录和文件作为配置的数据来源,同样只需要在ConfigureAppConfiguration方法中添加即可,见如下代码:
var pathFile = Path.Combine(Directory.GetCurrentDirectory(), "s");
config.AddKeyPerFile(directoryPath: pathFile, optional: true);
通过一个Action测试一下:
publicContentResult GetFileConfiguration()
{
returnnewContentResult() { Content = $"1.txt:{_configuration[".txt"]}, 2.txt:{_configuration[".txt"]}"};
}
返回结果为:
.txt:s1,.txt:s2
可见这样的方法是将s文件夹下的两个文件的文件名作为了Key,文件内容作为Value。
三、命令行
通过命令行启动应用的时候,可以在命令行中通过添加Key-Value的方式作为配置的数据来源,例如执行如下命令启动应用:
dotnet run key1=value1 key2=value2
访问定义好的如下Action:
publicContentResult GetCommandConfiguration()
{
returnnewContentResult() { Content = $"key1:{_configuration["key1"]}, key2:{_configuration["key2"]}"};
}
返回结果为:
key1:value1,key2:value2
这是由于在默认的WebHost.CreateDefaultBuilder(args)方法中添加了对命令行参数的调用,如果需要在ConfigureAppConfiguration方法中继续添加,只需要在该方法中南调用config.AddCommandLine(args)方法即可。
四、环境变量
在WebHost.CreateDefaultBuilder(args)方法中,除了会加载命令行参数,还会加载环境变量中的数据。此处的环境变量包括系统的环境变量,例如下图2

图2
环境变量中的“变量”和“值”会被读取为配置的Key和Value。
除了读取系统的环境变量,也可以在项目的属性中添加,例如在项目的属性中添加,例如下图3:

图3
除了熟悉的名为ASPNETCORE_ENVIRONMENT的环境变量,又在这里添加了一个Key为TestKey,Value为TestValue的环境变量。
添加一个Action测试一下:
publicContentResult GetEnvironmentVariables()
{
returnnewContentResult() { Content = $"TestKey:{_configuration["TestKey"]}, OS:{_configuration["OS"]}"};
}
分别读取了图2和图3中的两个环境变量,访问这个Action,返回结果为:
TestKey:TestValue,OS:Windows_NT
五、内存对象
以上的例子都是将一些外部的数据源读取并转换成了配置中的Key-Value格式,那么是否可以直接在应用中通过代码方式创建一些Key-Value值并加入到配置中去呢?这当然是可以的。常见的就是Dictionary了,新建一个Dictionary代码如下:
public static readonly Dictionary<string, string> dict = newDictionary<string, string> { { "ThemeName", "Purple"},{"ThemeColor", "#7D26CD"} };
在ConfigureAppConfiguration方法中将其加入到配置中去:
config.AddInMemoryCollection(dict);
新建一个Action进行测试:
publicContentResult GetMemoryConfiguration()
{
returnnewContentResult() { Content = "ThemeName:{_configuration["ThemeName"]}, ThemeColor:{_configuration["ThemeColor"]}"};
}
返回结果为:
ThemeName:Purple,ThemeColor:#7D26CD
ASP.NET Core 2.2 : 二十二. 多样性的配置方式的更多相关文章
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- 学习ASP.NET Core Blazor编程系列十——路由(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
随机推荐
- Tomcat中文乱码问题
新从官网下载的Tomcat7和Tomcat8,在运行的时候都会有乱码的问题,就此发现问题,我们就给它就地正法! 经过初步的分析,问题产生的大概原因是由于Tomcat的log日志模块不识别中文的问题, ...
- Android常用库源码解析
图片加载框架比较 共同优点 都对多级缓存.线程池.缓存算法做了处理 自适应程度高,根据系统性能初始化缓存配置.系统信息变更后动态调整策略.比如根据 CPU 核数确定最大并发数,根据可用内存确定内存缓存 ...
- 分布式存储——ceph 的 python 基础接口
python 使用 boto 库完成分布式存储读.写.判断接口 import boto import boto.s3.connection from boto.s3.key import Key im ...
- netty源码解解析(4.0)-18 ChannelHandler: codec--编解码框架
编解码框架和一些常用的实现位于io.netty.handler.codec包中. 编解码框架包含两部分:Byte流和特定类型数据之间的编解码,也叫序列化和反序列化.不类型数据之间的转换. 下图是编解码 ...
- 编程题及解题思路(1,String)
题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,F ...
- .NET CORE 怎么样从控制台中读取输入流
.NET CORE 怎么样从控制台中读取输入流 从Console.ReadList/Read 的源码中,可学习到.NET CORE 是怎么样来读取输入流. 也可以学习到是如何使用P/Invoke来调用 ...
- Codeforces 697D
题意略. 思路: 对于随机产生的一个数列,对于某个儿子,其兄弟在其前面的概率为 1 / 2. 所以这个兄弟对期望的贡献为son[v] / 2,所有兄弟加起来即为(tot - 1) / 2. 详见代码: ...
- Leetcode之二分法专题-875. 爱吃香蕉的珂珂(Koko Eating Bananas)
Leetcode之二分法专题-875. 爱吃香蕉的珂珂(Koko Eating Bananas) 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H ...
- 华为手机,删除安装包apk
1.下载“文件管理”,完成安装后,打开文件管理. 2.找到安装包,单击. 3.长按想要删除的apk文件,页面上会出现垃圾箱的图标,点击垃圾箱即可完成删除.
- Timus-1005. Stone Pile-01背包
传送门:http://acm.timus.ru/problem.aspx?space=1&num=1005 参考:https://www.cnblogs.com/yinzm/p/6629222 ...