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", "#000000")}"};
}

再次访问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["1.txt"]}, 2.txt:{_configuration["2.txt"]}"};
}

返回结果为:

1.txt:s1,2.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

 

 

 

本文链接:https://2i3i.com/aspnetcore_22.html ,转载请注明来源地址。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇