前言
.NET Core 在配置文件的操作上相對於.NET Framework做了不少改變,今天來聊一聊。關於Configuration的Package都是以Microsoft.Extensions.Configuration
開頭的支持多種方式的配置,包括內存、Json文件、XML文件等等,今天我們主要用Json格式文件配置來演示。
開始
新建一個ConsoleApp(這里為了方便演示就用控制台程序來演示了,而不用ASP.NET Core),添加兩個Package:
Install-Package Microsoft.Extensions.Configuration -Version 2.0.1
Install-Package Microsoft.Extensions.Configuration.Json -Version 2.0.1
添加Json配置文件,讀取配置
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var config = builder.Build();
//讀取配置
Console.WriteLine(config["Alipay:AppId"]);
Console.WriteLine(config["Alipay:PriviteKey"]);
我們的Json文件內容如下:
{
"Alipay": {
"AppId": "20185555",
"PriviteKey": "dasfdafafafa"
}
}
我們通過ConfigurationBuilder
對象來創建ConfigurationRoot
對象,並用其來讀取配置。SetBasePath()
方法是用來設置我們配置對象需要的配置文件的基礎路徑,比如我們將基礎路徑設置為C:\ConsoleApp
,那么他讀取我們的配置文件appsettings.json
的路徑將是C:\ConsoleApp\appsettings.json
運行:
多次調用 AddJsonFile 方法會發生什么
我們新建一個appsettings.Test.json
文件,添加如下內容:
{
"Alipay": {
"AppId": "20185555Testss",
"PriviteKey": "dasfdafafafaTestss"
}
}
然后修改一下代碼:
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Test.json");
可以看見我們向ConfigurationBuilder
對象設置了兩次Json文件,看一下運行效果:
可以得出結論:讀取配置的時候會選擇最后添加的文件。
那么我們前一個文件去哪了呢?我們的ConfigurationRoot
對象有一個Providers
屬性存儲了,我們添加的文件信息,我們可以遍歷它:
foreach (var provider in config.Providers)
{
provider.TryGet("Alipay:AppId", out string val);
Console.WriteLine(val);
}
運行:
可以看出我們兩個文件的值都被讀取到了!
配置重載
我們的配置文件可能會被更改,那么我們如何獲取最新的配置?我們在添加文件的時候可以將一個名為reloadOnChange
的參數設置為true,那么當我們的文件發生更改時,就會重新載入配置到內存中來,然后我們獲取到的配置就行最新的。我們讀取配置的時候並不是每次讀取都是從文件里面讀取,而是配置文件的所有配置信息都會被加載到內存中來,我們每次從內存讀取就行了。
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Test.json",true,reloadOnChange:true);
var config = builder.Build();
//讀取配置
Console.WriteLine(config["Alipay:AppId"]);
Console.WriteLine(config["Alipay:PriviteKey"]);
Console.WriteLine("更改文件之后,按下任意鍵");
Console.ReadKey();
Console.WriteLine("change:");
Console.WriteLine(config["Alipay:AppId"]);
Console.WriteLine(config["Alipay:PriviteKey"]);
Console.ReadKey();
我們看一下效果:
今天就到這里了!
Demo:https://github.com/stulzq/BlogDemos/tree/master/ConfigurationTest