ASP.NET Core - 配置系統之配置新增

啊晚發表於2023-03-06

2. 配置新增

配置系統可以讀取到配置檔案中的資訊,那必然有某個地方可以將配置檔案新增到配置系統中。之前的文章中講到 ASP.NET Core 入口檔案中,builder(WebApplicationBuilder 物件) 中有一個 Configuration 屬性,這裡就是我們擴充套件新增額外的配置的地方。

檢視 Configuration 屬性,可以看到是 ConfigurationManager 型別,而 ConfigurationManager 實現了 IConfigurationBuilder 介面。

image

image

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 - 配置系統之配置讀取

相關文章