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

 更新时间:2025年04月25日 09:19:18   作者:猫霸  
在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作,这里我们以为.NET 的源码项目为例,来看下.NET中的配置主要是有那些类库,感兴趣的朋友一起看看吧

什么是配置

.NET中的配置,本质上就是key-value键值对,并且key和value都是字符串类型。

在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作,这里我们以为.NET 的源码项目为例,来看下.NET中的配置主要是有那些类库。下面这个截图是.NET 源码中和配置相关的所有类库,所有配置相关的类库都是都是以Microsoft.Extensions.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#实体类上,方便程序使用。

从上面可以看到,主要有四个类库:第1个类库Abstractions负责定义配置的一些接口,第2个类库Configuration负责定义配置的简单实现。第3到第8个类库都是具体的配置提供程序,第9个类库Binder负责将配置绑定到指定的的Model,方便程序使用。

配置提供程序,.NET中有多个类库提供程序,每个类库提供程序都是以单独的类库向外提供,基本上每个类库就是三个文件,分别是ConfigurationExtensions.cs、ConfigurationProvider.cs和ConfigurationSource.cs,这三个类分别表示配置的扩展方法、配置提供程序和配置源。配置源用于生成配置提供程序。

在第2个类库中,微软帮助我们实现了一个基于类库的配置提供程序,我们在列表中没有单独列举这个类库提供程序。

配置源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<string> GetChildKeys(IEnumerable<string> earlierKeys, string? parentPath);
}

配置构建者IConfigurationBuilder

上面的IConfigurationSource和IConfigurationProvider分别表示一种数据源和对一种数据源进行读写操作。但是一个程序的配置可能来自很多地方,可能一部分配置来自环境变量、一部分配置来自文件等等。这个时候IConfigurationBuilder配置构建者就诞生了,IConfigurationBuilder接口维护了多个配置源,并提供一个Build方法生成一个统一的配置IConfigurationRoot 来统一对整个程序的配置进行读取、写入、重载等操作。但是这里大家注意,IConfigurationRoot 对配置的访问,本质上还是通过配置提供程序IConfigurationProvider来进行的。

假设,当我们查找一个Key为Name的配置,IConfigurationRoot 内部会遍历所有Sources 属性生成的IConfigurationProvider,然后依次调用IConfigurationProvider的TryGet来获取Name的具体配置数据。

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

配置构建者实现类ConfigurationBuilder

在具体的配置构建者的Build方法中,我们可以看到,它依次调用IConfigurationProvider的Buid方法生成多个配置提供程序IConfigurationProvider ,然后将所有的配置提供程序providers 传给了ConfigurationRootConfigurationRoot正是调用providers 的一系列方法实现对配置的读取、写入、重载等操作。

 public class ConfigurationBuilder : 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)
     {
         ThrowHelper.ThrowIfNull(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);
     }
 }

配置接口IConfiguration

这个接口就是最核心的配置接口,提供了对配置的读取、写入、重载等操作,它的实现类是ConfigurationRoot,上面我们已经介绍过,IConfiguration本身还是通过各个配置提供程序对配置进行访问操作。

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

配置接口IConfigurationRoot

IConfigurationRoot其实是配置的根接口,该接口有个最重要的属性Providers 负责保存所有的配置提供程序,IConfiguration对配置的访问,就是通过遍历这个Providers来访问的。

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

实现自定义配置提供程序

实现自定义配置提供程序,其实只需要实现三个类就可以,一个是配置源、一个是配置提供程序、一个是针对当前配置的扩展方法。第三个类可有可无,不过我们一般都要实现。我们来参考下基于命令行的配置提供程序类库的文件。

接下来,我们来实现一个基于数据库的配置提供程序,分别实现配置源DataBaseConfigurationSource 、配置提供程序DataBaseConfigurationExtensions 和扩展方法类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"];
}

到此这篇关于深入理解.NET Core中的配置Configuration的方法的文章就介绍到这了,更多相关.NET Core配置Configuration内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ajaxToolkit:TextBoxWatermarkExtender演示与实现代码

    ajaxToolkit:TextBoxWatermarkExtender演示与实现代码

    该控件的效果就是在TextBox控件上添加“水印”效果,也就是当TextBox为空时,显示提示消息,一旦TextBox聚焦,样式就消失,看起来还挺不错的吗,感兴趣的你可以了解下哦,希望本文对你有所帮助
    2013-01-01
  • visual studio 2019使用net core3.0创建winform无法使用窗体设计器

    visual studio 2019使用net core3.0创建winform无法使用窗体设计器

    这篇文章主要介绍了visual studio 2019使用net core3.0创建winform无法使用窗体设计器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • ADO.NET防SQL注入与使用参数增删改查

    ADO.NET防SQL注入与使用参数增删改查

    这篇文章介绍了ADO.NET防SQL注入与使用参数实现增删改查的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 正则表达式速查表(ASP.NET)

    正则表达式速查表(ASP.NET)

    正则表达式速查表 ASP.NET,学习正则表达式的朋友可以参考下
    2012-03-03
  • ASP.NET图片处理三类经典问题

    ASP.NET图片处理三类经典问题

    这篇文章主要介绍了ASP.NET图片处理三类经典问题,验证码的实现、给图片加文字,最后一个就是生成缩略图,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • asp.net画曲线图(折线图)代码 详细注释

    asp.net画曲线图(折线图)代码 详细注释

    asp.net画曲线图(折线图), 需要的朋友可以参考下。
    2010-03-03
  • .Net 下区别使用 ByRef/ByVal 的重要性 分享

    .Net 下区别使用 ByRef/ByVal 的重要性 分享

    这篇文章介绍了.Net 下区别使用 ByRef/ByVal 的重要性,有需要的朋友可以参考一下
    2013-07-07
  • ASP.NET MVC中异常Exception拦截的深入理解

    ASP.NET MVC中异常Exception拦截的深入理解

    异常信息的处理在程序中非常重要, 在asp.net mvc中提供异常属性拦截器进行对异常信息的处理,下面这篇文章主要给大家介绍了关于ASP.NET MVC中异常Exception拦截的相关资料,需要的朋友可以参考下
    2018-07-07
  • .NET使用QuestPDF生成PDF的实战指南

    .NET使用QuestPDF生成PDF的实战指南

    在数字化转型的浪潮中,PDF文档的生成需求早已从简单的文本导出演变为复杂的数据可视化、动态布局和跨平台兼容性挑战,传统PDF生成工具面临API复杂、学习曲线陡峭、性能瓶颈等痛点,QuestPDF的出现,彻底改变了这一局面,本文将带你全面掌握QuestPDF
    2025-08-08
  • Hangfire在ASP.NET CORE中的简单实现方法

    Hangfire在ASP.NET CORE中的简单实现方法

    下面小编就为大家分享一篇Hangfire在ASP.NET CORE中的简单实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论