ASP.NET Core

2023-03-06 12:00:39

2. 設定新增

設定系統可以讀取到組態檔中的資訊,那必然有某個地方可以將組態檔新增到設定系統中。之前的文章中講到 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 - 設定系統之設定讀取