在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门。
不管是官方自带的服务,还是我们自己编写的服务都是用它来实现自己服务的动态配置,这就是约定。
配置文件之所以会成为约定,最主要的原因就是好用,不然可能第三方的配置文件管理的就会出来替代官方的配置文件管理系统,官方也提供了对应的接口来让第三方接入。
正文官方提供了 Microsoft.Extensions.Configuration.Abstration接口。
同时提供了Microsoft.Extensions.Configuration 来作为实现。
所以我们如果想自己写第三方的包,那么就可以对 Microsoft.Extensions.Configuration.Abstration 的某一部分或者全部实现。
初学.net core的时候,陷入了一个误区,当时认为配置系统就是从json中进行读取,实际上配置系统是可以从命令行中获取、从环境变量中获取,只要他们符合key-value这种字符串键值对的方式。
配置文件系统有四个主要的接口,也可以理解为四个主要的模块功能。后面用代码解释一下这几个的作用。
IConfiguration
IConfigurationRoot
IConfigurationSection
IConfigurationBuilder
配置扩展点:
1.IConfigurationSource
2.IConfigurationProvider
扩展上诉两个可以帮助扩展不同配置来源。
static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(new Dictionary<string,string>() { {"key1","value1"}, {"key2","value2"}, }); IConfigurationRoot configurationRoot = builder.Build(); Console.WriteLine(configurationRoot["key1"]); Console.WriteLine(configurationRoot["key2"]); }看下ConfugurationBuilder:
/// <summary> /// Used to build key/value based configuration settings for use in an application. /// </summary> public class ConfigurationBuilder : IConfigurationBuilder { /// <summary> /// Returns the sources used to obtain configuration values. /// </summary> public IList<IConfigurationSource> Sources { get; } = new List<IConfigurationSource>(); /// <summary> /// Gets a key/value collection that can be used to share data between the <see cref="IConfigurationBuilder"/> /// and the registered <see cref="IConfigurationProvider"/>s. /// </summary> public IDictionary<string, object> Properties { get; } = new Dictionary<string, object>(); /// <summary> /// Adds a new configuration source. /// </summary> /// <param>The configuration source to add.</param> /// <returns>The same <see cref="IConfigurationBuilder"/>.</returns> public IConfigurationBuilder Add(IConfigurationSource source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } Sources.Add(source); return this; } /// <summary> /// Builds an <see cref="IConfiguration"/> with keys and values from the set of providers registered in /// <see cref="Sources"/>. /// </summary> /// <returns>An <see cref="IConfigurationRoot"/> with keys and values from the registered providers.</returns> 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); } }在看一个东西的功能的时候一定要看下顶部这句话:
/// <summary> /// Used to build key/value based configuration settings for use in an application. /// </summary> public class ConfigurationBuilder : IConfigurationBuilder翻译过来就是用于构建在应用程序中使用的基于键/值的配置设置。
那么这个时候我们可以重点看下build,毕竟是用来构建的。
从上述语义中,大概知道是IConfigurationSource 转换为 IConfigurationProvider。
那么重点看下这两个。
先看IConfigurationSource 接口。
/// <summary> /// Represents a source of configuration key/values for an application. /// </summary> public interface IConfigurationSource { /// <summary> /// Builds the <see cref="IConfigurationProvider"/> for this source. /// </summary> /// <param>The <see cref="IConfigurationBuilder"/>.</param> /// <returns>An <see cref="IConfigurationProvider"/></returns> IConfigurationProvider Build(IConfigurationBuilder builder); }表示一个配置文件的来源。里面只有一个方法就是Provider,这时候猜想IConfigurationProvider就是用于统一获取值的方式的。