重新整理 .net core 實踐篇—————配置系統之軍令狀[七](配置檔案)

不問前世發表於2021-06-01

前言

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

正文

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

是倒著獲取的。

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

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

相關文章