設定系統可以讀取到組態檔中的資訊,那必然有某個地方可以將組態檔新增到設定系統中。之前的文章中講到 ASP.NET Core 入口檔案中,builder(WebApplicationBuilder 物件) 中有一個 Configuration 屬性,這裡就是我們擴充套件新增額外的設定的地方。
檢視 Configuration 屬性,可以看到是 ConfigurationManager 型別,而 ConfigurationManager 實現了 IConfigurationBuilder 介面。
IConfigurationBuilder 介面定義如下:
public interface IConfigurationBuilder{
// 存放用於該 Builder 的 Sources 列表中各個元素的共用字典
IDictionary<string, object> Properties { get; }
// 已註冊的 IConfigurationSource 列表
IList<IConfigurationSource> Sources { get; }
// 將 IConfigurationSource 新增到 Sources 中
IConfigurationBuilder Add(IConfigurationSource source);
// 通過 Sources 構建設定提供程式範例,並建立 IConfigurationRoot 範例
IConfigurationRoot Build();
}
而它的實現類 ConfigurationBuilder 就是設定系統的入口。
public class ConfigurationBuilder : IConfigurationBuilder
{
public IList<IConfigurationSource> Sources { get; } = new List<IConfigurationSource>();
public IDictionary<string, object> Properties { get; } = new Dictionary<string, object>();
public IConfigurationBuilder Add(IConfigurationSource source)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
Sources.Add(source);
return this;
}
public IConfigurationRoot Build()
{
var providers = new List<IConfigurationProvider>();
foreach (IConfigurationSource source in Sources)
{
IConfigurationProvider provider = source.Build(this);
providers.Add(provider);
}
return new ConfigurationRoot(providers);
}
}
當我們啟動一個 ASP.NET Core應用的時候是建立並啟動了一個Web主機,由 Web 主機來啟動並管理我們的應用的生命週期,在這個過程中會預設新增一些設定提供程式,載入一些設定資訊。這些操作就在以下程式碼中:
var builder = WebApplication.CreateBuilder(args);
.NET Core 框架下的主機除了適用於 Web 應用的 Web 主機之外,還有通用主機。若是在普通的控制檯應用程式,想要通過主機啟動應用,並使用設定系統可用以下方式:
(1) 新增 Microsoft.Extensions.Hosting Nuget 包
(2) 通過以下程式碼建立主機
using IHost host = Host.CreateDefaultBuilder(args).Build();
host.Run();
主機這塊就先稍微瞭解以下,後面還會有專門的文章去介紹。除了通過主機的方式使用設定系統之外,我們也可以直接通過 ConfigurationBuilder 類構建,如下:
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
config.GetValue<string>("Logging:LogLevel:Default");
這裡需要引入相應的Nuget包,例如使用 ConfigurationBinder 相關的擴充套件方法就要引入 Microsoft.Extensions.Configuration.Binder Nuget包,使用 Json 格式組態檔就要引入Microsoft.Extensions.Configuration.Json Nuget包,該Nuget 包中包含 AddJsonFile 擴充套件方法,通過指定檔案路徑新增相應的組態檔到設定系統中。
組態檔多種多樣,比較常用的都有 Json 、xml、ini、yaml 等多種,甚至設定資訊不一定儲存在檔案之中。.NET Core設定系統對各種來源的設定資訊進行了抽象,不同來源只要提供相應的設定提供程式即可,也就是我們上面在 IConfigurationRoot 介面中看到的 IConfigurationProvider 介面的實現類。設定提供程式內部對不同來源不同格式的設定資訊進行載入、重新整理,並提供統一的存取方式,也就是鍵值對,實際上所有的設定資訊最終會以鍵值對的方式被讀取到記憶體中的Dictionary物件中。
我們要新增不同型別不同來源的設定資訊,只需要通過 IConfigurationBuilder 實現類物件新增不同的設定提供程式即可。在ASP.NET Core 應用之中,可以通過以下方式進行新增:
// 新增一個xml組態檔,並加入到設定系統中
var configirationFilePath = Path.Combine(Directory.GetCurrentDirectory(), "xxx.xml");
builder.Configuration.AddXmlFile(configirationFilePath);
也可以通過以下方式:
builder.WebHost.ConfigureAppConfiguration(builder =>
{
builder.AddXmlFile("");
});
這兩種方式是一樣的效果的,只不過具體的實現類不同,ConfigureAppConfiguration 可以將原有的設定提供程式情況,而 builder.Configuration 則不行,只能往集合後面繼續新增。
參考文章:
ASP.NET Core 中的設定 | Microsoft Learn
設定 - .NET | Microsoft Learn
理解ASP.NET Core - 設定(Configuration)
ASP.NET Core 系列:
目錄:ASP.NET Core 系列總結
上一篇:ASP.NET Core - 設定系統之設定讀取