前言
介紹一下配置系統中的配置檔案,很多服務的配置都寫在配置檔案中,也是配置系統的大頭。
正文
在asp .net core 提供了下面幾種配置檔案格式的讀取方式。
Microsoft.extensions.configuration.Ini
Microsoft.extensions.configuration.Json
Microsoft.extensions.configuration.NewtonsoftJson
Microsoft.extensions.configuration.Xml
Microsoft.extensions.configuration.UserSecrets
這裡演示json的,因為大多數的我們用的還是json。
那麼這裡就要引入:Microsoft.extensions.configuration.Json 這個庫。
在根目錄在建立appsettings.json 這個檔案:
裡面如下:
{
"key1": "value1",
"key2": "value2"
}
程式碼:
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json");
var configurationRoot = builder.Build();
Console.WriteLine(configurationRoot["key1"]);
Console.WriteLine(configurationRoot["key2"]);
結果:
如果說檔案找不到,那麼可能是下面這種情況,要設定複製過去。
如果我們這個appsettings.json 不存在的話,那麼會報錯。
當然我們可以設定如果沒有這個appsettings.json 也不報錯。
我新增了一個不存在的配置檔案appsettings_dev.json,那麼會報錯。
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json");
builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings_dev.json");
var configurationRoot = builder.Build();
Console.WriteLine(configurationRoot["key1"]);
Console.WriteLine(configurationRoot["key2"]);
報錯如下:
但是如果設定optional,那麼是可選的,沒有的話也不會報錯。
builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings_dev.json",optional:true);
這裡面同樣AddJsonFile有一個屬性reloadOnChange,這個屬性設定是否當我們配置檔案修改的時候,是否重新載入這個檔案,預設為true。
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true);
var configurationRoot = builder.Build();
Console.WriteLine(configurationRoot["key1"]);
Console.WriteLine(configurationRoot["key2"]);
Console.ReadKey();
Console.WriteLine(configurationRoot["key1"]);
Console.WriteLine(configurationRoot["key2"]);
Console.ReadKey();
修改後,按下enter鍵。
修改內容如下:
{
"key1": "value1_change",
"key2": "value2_change"
}
這裡只演示了json檔案,其實檔案也一樣。
因為在前面中分析過ConfigurationRoot 這個類,知道它的索引,後面新增的檔案配置會覆蓋前面的,這裡再貼一下。
public string this[string key]
{
get
{
for (int i = _providers.Count - 1; i >= 0; i--)
{
IConfigurationProvider provider = _providers[i];
if (provider.TryGet(key, out string value))
{
return value;
}
}
return null;
}
set
{
if (!_providers.Any())
{
throw new InvalidOperationException(SR.Error_NoSources);
}
foreach (IConfigurationProvider provider in _providers)
{
provider.Set(key, value);
}
}
}
是倒著獲取的。
結
下一節 配置系統之間諜[八](檔案監聽)
以上只是個人整理,如有錯誤,望請指出,謝謝。