商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 深入理解.NETCore中的配置Configuration的方法

深入理解.NETCore中的配置Configuration的方法

  发布于2026-07-23 阅读(0)

扫一扫,手机访问

什么是配置

.NET 中的配置,说白了就是一堆 key-value 键值对,key 和 value 都是字符串类型,简单直接。

围绕这个核心,.NET 提供了一大堆配置提供程序,用来从不同来源读取、写入、重载配置。我们不妨以 .NET 源码项目为例,看看这里面到底有哪些类库。下面这张截图,就是 .NET 源码中和配置相关的所有类库——所有配置相关的类库,名字都以 Microsoft.Extensions.Configuration 开头。

深入理解.NETCore中的配置Configuration的方法

乍一看挺多,别急,拆开来看就清楚了。

类库名称类库作用
1、Microsoft.Extensions.Configuration.Abstractions定义配置相关的接口,其他所有配置类库都必须引用这个类库
2、Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Abstractions类库的简单实现
3、配置提供程序:Microsoft.Extensions.Configuration.CommandLine基于命令行的配置提供程序,负责对命令行的配置进行读写、载入、重载等操作。
4、配置提供程序:Microsoft.Extensions.Configuration.EnvironmentVariables基于环境变量的配置提供程序,负责对环境变量的配置进行读写、载入、重载等操作
5、配置提供程序:Microsoft.Extensions.Configuration.FileExtensions基于的文件提供程序的基类库,文件提供程序包括基于Json文件、Ini文件、Xml文件或者自定义文件等。
6、配置提供程序:Microsoft.Extensions.Configuration.Json基于Json文件的配置提供程序程序,负责从Json文本文件中对配置读写、载入、重载等操作。
7、配置提供程序:Microsoft.Extensions.Configuration.Ini基于Ini文件的配置提供程序,负责从Ini文件中对配置进行读写、载入、重载等操作。
8、配置提供程序:Microsoft.Extensions.Configuration.UserSecrets基于UserSecrets的配置提供程序,这个本质上也是一种基于Json文件类型的配置程序。主要用于管理应用机密
9、Microsoft.Extensions.Configuration.Binder负责将key-value键值对的配置列表绑定到指定的C#实体类上,方便程序使用。

总结一下,这九大模块可以分成四类:第一个类库 Abstractions 负责定义接口,第二个类库 Configuration 提供基础实现,第三到第八个是具体的配置提供程序,第九个 Binder 负责把配置绑定到实体类,方便程序直接使用。

每个配置提供程序都是一个独立的类库,内部结构非常相似——基本上是三个文件:ConfigurationExtensions.csConfigurationProvider.csConfigurationSource.cs,分别对应扩展方法、配置提供程序和配置源。配置源的作用就是生成配置提供程序,这层关系后面会细讲。

另外,第二个类库中还内置了一个默认的配置提供程序(基于内存),表格里没单独列出来,后续用到时会提到。

配置源IConfigurationSource

配置源代表一个单独的配置集合,可以来自内存,也可以来自 JSON 文件,但配置源本身不直接提供访问操作。它只有一个接口方法 Build,返回一个具体的配置提供程序 IConfigurationProvider,由后者负责读取、写入、载入和重载配置。

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

配置提供程序IConfigurationProvider

配置提供程序才是真正干活的——实现配置的读取、设置、重载,所有数据都以键值对形式暴露。

public interface IConfigurationProvider{    //读取配置    bool TryGet(string key, out string? value);    //修改配置    void Set(string key, string? value);    //获取重载配置的Token    IChangeToken GetReloadToken();    //载入配置    void Load();    //获取指定父路径下的直接子节点Key,然后 Concat(earlierKeys) 一同返回    IEnumerable GetChildKeys(IEnumerable earlierKeys, string? parentPath);}

配置构建者IConfigurationBuilder

有了数据源和读写操作,但一个程序的配置可能来自多个地方——环境变量、文件、命令行等等。这时候就需要 IConfigurationBuilder 来统一管理了。它维护着一个配置源列表,并提供一个 Build 方法,生成一个全局的 IConfigurationRoot 对象,统一对程序的所有配置进行读写、重载。注意,IConfigurationRoot 内部访问配置时,本质上还是通过各个 IConfigurationProvider 来完成的。

举个例子,当查找一个 key 为 "Name" 的配置时,IConfigurationRoot 会遍历所有 Sources 属性生成的 IConfigurationProvider,依次调用 TryGet,直到找到结果为止。

public interface IConfigurationBuilder{    //保存Build的一些公开的字典属性,有需要的化可以使用该字段存放一些变量    IDictionary Properties { get; }    //来自多个地方的配置源集合    IList Sources { get; }    //向Sources属性中添加一个配置源    IConfigurationBuilder Add(IConfigurationSource source);    //基于所有配置源生成一个全局的配置,供程序读写,一般我们都是用这个接口对配置进行读写。    IConfigurationRoot Build();}

配置构建者实现类ConfigurationBuilder

ConfigurationBuilderBuild 方法中,可以看到它依次调用每个 IConfigurationSourceBuild 方法,生成多个 IConfigurationProvider,然后把这些 provider 全部传给 ConfigurationRoot。而 ConfigurationRoot 正是通过调用这些 provider 的方法来实现配置的读取、写入和重载。

 public class ConfigurationBuilder : IConfigurationBuilder {     private readonly List _sources = new();     public IList Sources => _sources;     public IDictionary Properties { get; } = new Dictionary();     public IConfigurationBuilder Add(IConfigurationSource source)     {         ThrowHelper.ThrowIfNull(source);         _sources.Add(source);         return this;     }     public IConfigurationRoot Build()     {         var providers = new List();         foreach (IConfigurationSource source in _sources)         {             IConfigurationProvider provider = source.Build(this);             providers.Add(provider);         }         return new ConfigurationRoot(providers);     } }

配置接口IConfiguration

这是最核心的配置接口,提供了对配置的读取、写入、重载等操作。它的实现类就是前面提到的 ConfigurationRoot,内部依然通过各配置提供程序来访问数据。

public interface IConfiguration{    //获取或设置配置    string? this[string key] { get; set; }    //获取指定key的配置子节点    IConfigurationSection GetSection(string key);    //获取当前配置的直接子节点列表    IEnumerable GetChildren();    //当配置发生变更时的token    IChangeToken GetReloadToken();}

配置接口IConfigurationRoot

IConfigurationRoot 是配置的根接口,一个关键属性是 Providers,保存了所有配置提供程序。IConfiguration 对配置的访问,最终就是通过遍历这个 Providers 列表来完成的。

public interface IConfigurationRoot : IConfiguration{    //强制重载所有配置    void Reload();    //所有配置提供程序    IEnumerable Providers { get; }

实现自定义配置提供程序

实现一个自定义配置提供程序,只需要三个类:一个配置源、一个配置提供程序、一个扩展方法类(可选,但通常都会加上)。来看一下基于命令行的配置提供程序类库的文件结构,就一目了然了。

深入理解.NETCore中的配置Configuration的方法

下面我们动手实现一个基于数据库的配置提供程序。分别实现配置源 DataBaseConfigurationSource、配置提供程序 DataBaseConfigurationProvider 和扩展方法类 DataBaseConfigurationExtensions。这里只做演示,具体的数据库读取逻辑就不展开了。

public class DataBaseConfigurationSource : IConfigurationSource{    public IConfigurationProvider Build(IConfigurationBuilder builder)    {        return new DataBaseConfigurationProvider();    }}public class DataBaseConfigurationProvider : ConfigurationProvider{    public override void Load()    {        base.Load();        //读取数据库配置    }}public static class DataBaseConfigurationExtensions{    public static IConfigurationBuilder AddDb(this IConfigurationBuilder configurationBuilder)    {        configurationBuilder.Sources.Add(new DataBaseConfigurationSource());        return configurationBuilder;    }}

调用自定义配置程序

static void Main(string[] args){    var builder = new ConfigurationBuilder()        .AddDb()        .Build();    var value = builder["key"];}
本文转载于:https://www.jb51.net/aspnet/340345sy9.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注