前言

介紹一下配置系統中的配置檔案,很多服務的配置都寫在配置檔案中,也是配置系統的大頭。

正文

在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);
}
}
}

是倒著獲取的。

下一節 配置系統之間諜[八](檔案監聽)

以上只是個人整理,如有錯誤,望請指出,謝謝。