大多数应用都离不开配置,本章将介绍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 : 二十二. 多样性的配置方式的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  8. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

  10. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

随机推荐

  1. linux下实现并发逻辑

    ################shell 模拟实现并发跑数#################有时候我们知道一些程序是可以同时跑的,互不影响,为了提高效率不得不使用并发跑脚本 #1.思路一我们都知道在 ...

  2. Vue的冒泡事件

    由于业务需求需要,需要在一个元素中的子元素添加一个点击事件. 但是刚好父元素也有一个点击事件.这个时候我们就需要使用到Vue中的阻止事件冒泡了.

  3. ubuntu16.04安装Ros(kinetic版本)【亲测好用】

    准备 1.ubuntu16.04 64位桌面版 ps:关于系统的下载和安装这里不做介绍,请自行百度,不是介绍重点 2.更改源 图上的几个勾默认是选上的,如果没有选上,选成上图这样(如果修改过勾,点击关 ...

  4. Django上线部署之Apache

    环境: 1.Windows Server 2016 Datacenter 64位 2.SQL Server 2016 Enterprise 64位 3.Python 3.6.0 64位 4.admin ...

  5. RabbitMQ的各个参数

    简介 原文:https://blog.csdn.net/vbirdbest/article/details/78670550 本节主要讨论队列声明的各个参数 queueDeclare(String q ...

  6. Linux相关安装文档

    一.JDK环境安装 1.查看linux上是否存在已安装好的JDK (1)java -version openjdk version "1.8.0_181"OpenJDK Runti ...

  7. MySQL之备份和还原

    在实际项目中对于数据库的安全是重中之重,为防万一我们需要做好备份工作.备份分为全量备份和增量备份,今天我们就来实践下备份和还原操作. 一.为什么需要备份 在生产环境中数据库可能会遭遇到各种各样的不测从 ...

  8. Linux下各目录及其作用

    目录及其作用 /:根目录,一般根目录下只存放目录,不要存放件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin: /usr/bin: 可执行二进制文件的目录,如 ...

  9. [Python] 通过采集两万条数据,对《无名之辈》影评分析

    一.说明 本文主要讲述采集猫眼电影用户评论进行分析,相关爬虫采集程序可以爬取多个电影评论. 运行环境:Win10/Python3.5. 分析工具:jieba.wordcloud.pyecharts.m ...

  10. NLP(十三) 词义消歧

    一个词可能有多个词义 例句 解释 She is my date date: 约会,日期 You have taken too many leaves to skip cleaning leaves i ...