Cấu hình trong .NET Core

Cấu hình là gì?

Trong .NET, cấu hình thực chất là một cặp khóa-giá trị, với cả khóa và giá trị đều là chuỗi.

.NET cung cấp nhiều nhà cung cấp cấu hình để đọc, ghi, tải lại cấu hình từ các nguồn khác nhau. Dưới đây chúng ta sẽ xem xét các thư viện liên quan đến cấu hình trong dự án mã nguồn của .NET. Hình dưới đây liệt kê tất cả các thư viện liên quan đến cấu hình, tất cả đều bắt đầu bằng Microsoft.Extensions.Configuration.

Tên Thư Viện Mô Tả
1. Microsoft.Extensions.Configuration.Abstractions Định nghĩa các giao diện liên quan đến cấu hình, tất cả các thư viện cấu hình khác đều phải tham chiếu đến thư viện này.
2. Microsoft.Extensions.Configuration Cung cấp triển khai đơn giản cho các giao diện được định nghĩa trong Microsoft.Extensions.Configuration.Abstractions.
3. Microsoft.Extensions.Configuration.CommandLine Nhà cung cấp cấu hình dựa trên dòng lệnh, chịu trách nhiệm đọc, ghi, tải và tải lại cấu hình từ dòng lệnh.
4. Microsoft.Extensions.Configuration.EnvironmentVariables Nhà cung cấp cấu hình dựa trên biến môi trường, chịu trách nhiệm đọc, ghi, tải và tải lại cấu hình từ biến môi trường.
5. Microsoft.Extensions.Configuration.FileExtensions Là thư viện cơ sở cho các nhà cung cấp cấu hình dựa trên tệp, bao gồm các loại tệp như JSON, INI, XML hoặc tệp tùy chỉnh.
6. Microsoft.Extensions.Configuration.Json Nhà cung cấp cấu hình dựa trên tệp JSON, chịu trách nhiệm đọc, ghi, tải và tải lại cấu hình từ tệp JSON.
7. Microsoft.Extensions.Configuration.Ini Nhà cung cấp cấu hình dựa trên tệp INI, chịu trách nhiệm đọc, ghi, tải và tải lại cấu hình từ tệp INI.
8. Microsoft.Extensions.Configuration.UserSecrets Nhà cung cấp cấu hình dựa trên UserSecrets, thực chất là một nhà cung cấp cấu hình dựa trên tệp JSON, chủ yếu dùng để quản lý thông tin bí mật ứng dụng.
9. Microsoft.Extensions.Configuration.Binder Gắn cấu hình dưới dạng danh sách khóa-giá trị vào các lớp C# cụ thể, thuận tiện cho việc sử dụng trong chương trình.

Từ bảng trên, có thể thấy có bốn thư viện chính:

  • Thư viện thứ nhất Abstractions định nghĩa các giao diện liên quan đến cấu hình.
  • Thư viện thứ hai Configuration cung cấp triển khai đơn giản cho cấu hình.
  • Thư viện thứ ba đến thứ tám là các nhà cung cấp cấu hình cụ thể.
  • Thư viện thứ chín Binder gắn cấu hình vào các đối tượng Model cụ thể.

Nhà Cung Cấp Cấu Hình

Mỗi nhà cung cấp cấu hình trong .NET thường bao gồm ba tệp: ConfigurationExtensions.cs, ConfigurationProvider.csConfigurationSource.cs. Mỗi tệp tương ứng với các phương thức mở rộng cấu hình, nhà cung cấp cấu hình và nguồn cấu hình.

Giao Diện IConfigurationSource

Giao diện IConfigurationSource đại diện cho một tập hợp cấu hình riêng biệt, có thể đến từ bộ nhớ hoặc tệp JSON. Tuy nhiên, IConfigurationSource không trực tiếp cung cấp truy cập đến cấu hình, mà chỉ cung cấp phương thức Build để tạo ra một nhà cung cấp cấu hình cụ thể.

public interface IConfigurationSource
{
    IConfigurationProvider Build(IConfigurationBuilder builder);
}

Giao Diện IConfigurationProvider

Giao diện IConfigurationProvider chịu trách nhiệm triển khai các chức năng như thiết lập, đọc, tải lại cấu hình và cung cấp cấu hình dưới dạng khóa-giá trị.

public interface IConfigurationProvider
{
    bool TryGet(string key, out string? value);
    void Set(string key, string? value);
    IChangeToken GetReloadToken();
    void Load();
    IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string? parentPath);
}

Giao Diện IConfigurationBuilder

Giao diện IConfigurationBuilder duy trì nhiều nguồn cấu hình và cung cấp phương thức Build để tạo ra một cấu hình toàn cục IConfigurationRoot để truy cập, ghi, tải lại cấu hình cho toàn bộ ứng dụng.

public interface IConfigurationBuilder
{
    IDictionary<string, object> Properties { get; }
    IList<IConfigurationSource> Sources { get; }
    IConfigurationBuilder Add(IConfigurationSource source);
    IConfigurationRoot Build();
}

Lớp ConfigurationBuilder

Trong phương thức Build của lớp ConfigurationBuilder, nó gọi phương thức Build của mỗi IConfigurationSource để tạo ra các nhà cung cấp cấu hình, sau đó truyền tất cả vào ConfigurationRoot.

public class ConfigBuilder : IConfigurationBuilder
{
    private readonly List<IConfigurationSource> _sources = new();
    public IList<IConfigurationSource> Sources => _sources;
    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 (var source in _sources)
        {
            var provider = source.Build(this);
            providers.Add(provider);
        }
        return new ConfigRoot(providers);
    }
}

Giao Diện IConfiguration

Giao diện IConfiguration cung cấp các phương thức để truy cập, ghi, tải lại cấu hình, triển khai bởi lớp ConfigRoot.

public interface IConfiguration
{
    string? this[string key] { get; set; }
    IConfigurationSection GetSection(string key);
    IEnumerable<IConfigurationSection> GetChildren();
    IChangeToken GetReloadToken();
}

Giao Diện IConfigurationRoot

Giao diện IConfigurationRoot là giao diện gốc của cấu hình, chứa thuộc tính Providers lưu trữ tất cả các nhà cung cấp cấu hình.

public interface IConfigurationRoot : IConfiguration
{
    void Reload();
    IEnumerable<IConfigurationProvider> Providers { get; }
}

Tự Định Nghĩa Nhà Cung Cấp Cấu Hình

Để tự định nghĩa nhà cung cấp cấu hình, cần triển khai ba lớp: nguồn cấu hình, nhà cung cấp cấu hình và phương thức mở rộng.

public class DbConfigSource : IConfigurationSource
{
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new DbConfigProvider();
    }
}

public class DbConfigProvider : ConfigurationProvider
{
    public override void Load()
    {
        base.Load();
        // Đọc cấu hình từ cơ sở dữ liệu
    }
}

public static class DbConfigExtensions
{
    public static IConfigurationBuilder AddDatabase(this IConfigurationBuilder builder)
    {
        builder.Sources.Add(new DbConfigSource());
        return builder;
    }
}

Sử Dụng Nhà Cung Cấp Cấu Hình Tự Định Nghĩa

static void Main(string[] args)
{
    var builder = new ConfigBuilder()
        .AddDatabase()
        .Build();
    var value = builder["key"];
}

Thẻ: .NETCore CấuHình NhàCungCấpCấuHình

Đăng vào ngày 20 tháng 6 lúc 19:53