浅析Asp.Net Core框架IConfiguration配置

一、建造者模式(Builder Pattern)
二、核心接口与配置存储本质
三、简易QueryString配置源实现
四、宿主配置与应用配置
五、文件配置源配置更新原理
一、建造者模式
为什么提建造者模式?在阅读.NET Core源码时,时常碰到IHostBuilder,IConfigurationBuilder,ILoggerBuilder等诸如此类带Builder名称的类/接口,起初专研时那是一头愣。知识不够,勤奋来凑,在了解到Builder模式后终于理解,明白这些Builder类是用来构建相对应类的对象,用完即毁别无他用。理解建造者模式,有助于阅读源码时发现核心接口/类,将文件分类,直指堡垒。详细建造者模式可参阅此篇文章:磁悬浮快线

二、核心接口与配置存储本质
在.NET Core中读取配置是通过IConfiguration接口,它存在于Microsoft.Extensions.Configuration.Abstractions项目中,如下图:
Microsoft.Extensions.Configuration.Abstractions

IConfiguration:配置访问接口
IConfigurationProvider:配置提供者接口
IConfigurationSource:配置源接口
IConfigurationRoot:配置根接口,继承IConfiguration,维护着IConfigurationProvider集合及重新加载配置
IConfigurationBuilder:IConfigurationRoot接口实例的构造者接口

1.服务容器中IConfiguration实例注册(ConfigurationRoot)

///
/// Represents the root of an hierarchy. => 配置根路径
///
public interface IConfigurationRoot : IConfiguration
{
///
/// Force the configuration values to be reloaded from the underlying s. => 从配置源重新加载配置
///
void Reload();

/// <summary>
/// The <see cref="IConfigurationProvider"/>s for this configuration. => 依赖的配置源集合
/// </summary>
IEnumerable<IConfigurationProvider> Providers { get; }

}
IConfigurationRoot(继承IConfiguration)维护着一个IConfigurationProvider集合列表,也就是我们的配置源。IConfiguration实例的创建并非通过new()方式,而是由IConfigurationBuilder来构建,实现了按需加载配置源,是建造者模式的充分体现。IConfigurationBuilder上的所有操作如:

HostBuilder.ConfigureAppConfiguration((context, builder) =>
{
builder.AddCommandLine(args); // 命令行配置源
builder.AddEnvironmentVariables(); // 环境配置源
builder.AddJsonFile(“demo.json”); // json文件配置源
builder.AddInMemoryCollection(); // 内存配置源
// …
})
皆是为IConfigurationRoot.Providers做准备,最后通过Build()方法生成ConfigurationRoot实例注册到服务容器

public class HostBuilder : IHostBuilder
{
private HostBuilderContext _hostBuilderContext;
// 配置构建 委托
private List<Action<HostBuilderContext, IConfigurationBuilder>> _configureAppConfigActions = new List<Action<HostBuilderContext, IConfigurationBuilder>>();
private IConfiguration _appConfiguration;
private void BuildAppConfiguration()
{
IConfigurationBuilder configBuilder = new ConfigurationBuilder();

	foreach (Action<HostBuilderContext, IConfigurationBuilder> buildAction in _configureAppConfigActions)
	{
		buildAction(_hostBuilderContext, configBuilder);
	}
	_appConfiguration = configBuilder.Build(); // 调用Build()创建IConfiguration 实例 ConfigurationRoot
	_hostBuilderContext.Configuration = _appConfiguration;
}
private void CreateServiceProvider()
{
	var services = new ServiceCollection();
	// register configuration as factory to make it dispose with the service provider
	services.AddSingleton(_ => _appConfiguration);  // 注册 IConfiguration - 单例
}

}
2.IConfiguration/IConfigurationSection读取配置与配置储存本质
程序中我们会通过如下方式获取配置值(当然还有绑定IOptions)

IConfiguration[“key”]
IConfiguration.GetSection(“key”).Value

而IConfiguration注册的实例是ConfigurationRoot,代码如下,其索引器实现竟是倒序遍历配置源,获取配置值。原来当我们通过IConfiguration获取配置时,其实就是倒序遍历IConfigurationBuilder加载进来的配置源。

public class ConfigurationRoot : IConfigurationRoot, IDisposable
{
private readonly IList _providers;
public IEnumerable Providers => _providers;
public string this[string key]
{
get
{
// 倒序遍历配置源,获取到配置 就返回,这也是配置覆盖的根本原因,后添加的相同配置会覆盖前面的
for (int i = _providers.Count - 1; i >= 0; i–)
{
IConfigurationProvider provider = _providers[i];

			if (provider.TryGet(key, out string value))
			{
				return value;
			}
		}

		return null;
	}
}

}
那么配置数据是以什么形式存储的呢?在Microsoft.Extensions.Configuration项目中,提供了一个IConfigurationProvider默认实现存储抽象类ConfigurationProvider,部分代码如下

///
/// Base helper class for implementing an
///
public abstract class ConfigurationProvider : IConfigurationProvider
{
protected ConfigurationProvider()
{
Data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}

/// <summary>
/// The configuration key value pairs for this provider.
/// </summary>
protected IDictionary<string, string> Data { get; set; }

public virtual bool TryGet(string key, out string value)
	=> Data.TryGetValue(key, out value);
/// <summary>
/// 虚方法,供具体配置源重写,加载配置到 Data中
/// </summary>
public virtual void Load() { }

}
从上可知,所有加载到程序中的配置源,其本质还是存储在Provider里面一个类型为IDictionary<string, string> Data属性中。由此推论: 当通过IConfiguration获取配置时,就是通过各个Provider的Data读取!

三、简易QueryString配置源实现
要实现自定义的配置源,只需实现IConfigurationProvider,IConfigurationSource两个接口即可,这里通过一个QueryString格式的简易配置来演示。虫洞隧道

1.queryString.config数据格式如下

server=localhost&port=3306&datasource=demo&user=root&password=123456&charset=utf8mb4

2.实现IConfigurationSource接口(QueryStringConfiguationSource)

public class QueryStringConfiguationSource : IConfigurationSource
{
public QueryStringConfiguationSource(string path)
{
Path = path;
}
///
/// QueryString文件相对路径
///
public string Path { get; }
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new QueryStringConfigurationProvider(this);
}
}
3.实现IConfigurationProvider接口(QueryStringConfiguationProvider)

public class QueryStringConfigurationProvider : ConfigurationProvider
{
public QueryStringConfigurationProvider(QueryStringConfiguationSource source)
{
Source = source;
}
public QueryStringConfiguationSource Source { get; }
///
/// 重写Load方法,将自定义的配置解析到 Data 中
///
public override void Load()
{
// server=localhost&port=3306&datasource=demo&user=root&password=123456&charset=utf8mb4 例子格式
string queryString = File.ReadAllText(Path.Combine(AppContext.BaseDirectory, Source.Path));
string[] arrays = queryString.Split(new[] { “&” }, StringSplitOptions.RemoveEmptyEntries); // & 号分隔

	foreach (var item in arrays)
	{
		string[] temps = item.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries);  // = 号分隔
		if (temps.Length != 2) continue;

		Data.Add(temps[0], temps[1]);
	}
}

}
4.IConfigurationBuilder配置源构建

public static class QueryStringConfigurationExtensions
{
///
/// 默认文件名称 queryString.config
///
///
///
public static IConfigurationBuilder AddQueryStringFile(this IConfigurationBuilder builder)
=> AddQueryStringFile(builder, “queryString.config”);
public static IConfigurationBuilder AddQueryStringFile(this IConfigurationBuilder builder, string path)
=> builder.Add(new QueryStringConfiguationSource(path));
}
5.Program加载配置源

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
// 加载QueryString配置源
builder.AddQueryStringFile();
//builder.AddQueryStringFile(“queryString.config”);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
至此,自定义QueryString配置源实现完成,便可通过IConfiguration接口获取值,结果如下

IConfiguration[“server”] => localhost
IConfiguration[“datasource”] => demo
IConfiguration[“charset”] => utf8mb4

四、宿主配置与应用配置
.NET Core官方已默认提供了:环境变量、命令行参数,Json、Ini等配置源,不过适用场景却应有不同。不妨可分为两类:一类是宿主配置源,一类是应用配置源
1.宿主配置源
宿主配置源:供IHost宿主启动时使用的配置源。环境变量、命令行参数就可归为这类,以IHostEnvironment为例

///
/// 提供运行环境相关信息
///
public interface IHostEnvironment
{
string EnvironmentName { get; set; }
string ApplicationName { get; set; }
string ContentRootPath { get; set; }
}
IHostEnvironment接口提供了当前应用运行环境相关信息,可以通过IsEnvironment()方法判断当前运行环境是Development还是Production、Staging。

public static bool IsEnvironment(this IHostEnvironment hostEnvironment, string environmentName)
{
if (hostEnvironment == null)
{
throw new ArgumentNullException(nameof(hostEnvironment));
}
return string.Equals(hostEnvironment.EnvironmentName, environmentName, StringComparison.OrdinalIgnoreCase);
}
hostEnvironment.EnvironmentName是什么?这就得益于它注册到服务容器时所赋的值:HostBuilder

public class HostBuilder:IHostBuilder
{
private void CreateHostingEnvironment()
{
_hostingEnvironment = new HostingEnvironment()
{
ApplicationName = _hostConfiguration[HostDefaults.ApplicationKey], // _hostConfiguration 类型是 IConfiguration
EnvironmentName = _hostConfiguration[HostDefaults.EnvironmentKey] ?? Environments.Production, // 当未配置环境时,默认Production环境,在使用vs开发启动时,lanuchSetting.json 配置了 环境变量:“ASPNETCORE_ENVIRONMENT”: “Development”
ContentRootPath = ResolveContentRootPath(_hostConfiguration[HostDefaults.ContentRootKey], AppContext.BaseDirectory),
};

	if (string.IsNullOrEmpty(_hostingEnvironment.ApplicationName))
	{
		// Note GetEntryAssembly returns null for the net4x console test runner.
		_hostingEnvironment.ApplicationName = Assembly.GetEntryAssembly()?.GetName().Name;
	}
}

}
由此可见,IHostEnvironment所提供的信息根由仍是从IConfiguration读取,而这些配置正是来自环境变量、命令行参数配置源。
2.应用配置源
应用配置源:供应用业务逻辑使用的配置源。Json、Ini、Xml以及自定义的QueryString等就可归为类。
http://kc.njitt.edu.cn/Item/4559.aspx
http://kc.njitt.edu.cn/Item/4560.aspx
http://kc.njitt.edu.cn/Item/4561.aspx
http://kc.njitt.edu.cn/Item/4562.aspx
http://kc.njitt.edu.cn/Item/4563.aspx
http://kc.njitt.edu.cn/Item/4564.aspx
http://kc.njitt.edu.cn/Item/4565.aspx
http://kc.njitt.edu.cn/Item/4566.aspx
http://kc.njitt.edu.cn/Item/4567.aspx
http://kc.njitt.edu.cn/Item/4568.aspx
http://kc.njitt.edu.cn/Item/4569.aspx
http://kc.njitt.edu.cn/Item/4570.aspx
http://kc.njitt.edu.cn/Item/4571.aspx
http://kc.njitt.edu.cn/Item/4572.aspx
http://kc.njitt.edu.cn/Item/4573.aspx
http://kc.njitt.edu.cn/Item/4574.aspx
http://kc.njitt.edu.cn/Item/4575.aspx
http://kc.njitt.edu.cn/Item/4576.aspx
http://kc.njitt.edu.cn/Item/4577.aspx
http://kc.njitt.edu.cn/Item/4578.aspx
http://kc.njitt.edu.cn/Item/4579.aspx
http://kc.njitt.edu.cn/Item/4580.aspx
http://kc.njitt.edu.cn/Item/4581.aspx
http://kc.njitt.edu.cn/Item/4582.aspx
http://kc.njitt.edu.cn/Item/4583.aspx
http://kc.njitt.edu.cn/Item/4584.aspx
http://kc.njitt.edu.cn/Item/4585.aspx
http://kc.njitt.edu.cn/Item/4586.aspx
http://kc.njitt.edu.cn/Item/4587.aspx
http://kc.njitt.edu.cn/Item/4588.aspx
http://kc.njitt.edu.cn/Item/4589.aspx
http://kc.njitt.edu.cn/Item/4590.aspx
http://kc.njitt.edu.cn/Item/4591.aspx
http://kc.njitt.edu.cn/Item/4592.aspx
http://kc.njitt.edu.cn/Item/4593.aspx
http://kc.njitt.edu.cn/Item/4594.aspx
http://kc.njitt.edu.cn/Item/4595.aspx
http://kc.njitt.edu.cn/Item/4596.aspx
http://kc.njitt.edu.cn/Item/4597.aspx
http://kc.njitt.edu.cn/Item/4598.aspx
http://kc.njitt.edu.cn/Item/4599.aspx
http://kc.njitt.edu.cn/Item/4600.aspx
http://kc.njitt.edu.cn/Item/4601.aspx
http://kc.njitt.edu.cn/Item/4602.aspx
http://kc.njitt.edu.cn/Item/4603.aspx
http://kc.njitt.edu.cn/Item/4604.aspx
http://kc.njitt.edu.cn/Item/4605.aspx
http://kc.njitt.edu.cn/Item/4606.aspx
http://kc.njitt.edu.cn/Item/4607.aspx
http://kc.njitt.edu.cn/Item/4608.aspx
http://kc.njitt.edu.cn/Item/4609.aspx
http://kc.njitt.edu.cn/Item/4610.aspx
http://kc.njitt.edu.cn/Item/4611.aspx
http://kc.njitt.edu.cn/Item/4612.aspx
http://kc.njitt.edu.cn/Item/4613.aspx
http://kc.njitt.edu.cn/Item/4614.aspx
http://kc.njitt.edu.cn/Item/4615.aspx
http://kc.njitt.edu.cn/Item/4616.aspx
http://kc.njitt.edu.cn/Item/4617.aspx
http://kc.njitt.edu.cn/Item/4618.aspx
http://kc.njitt.edu.cn/Item/4619.aspx
http://kc.njitt.edu.cn/Item/4620.aspx
http://kc.njitt.edu.cn/Item/4621.aspx
http://kc.njitt.edu.cn/Item/4622.aspx
http://kc.njitt.edu.cn/Item/4623.aspx
http://kc.njitt.edu.cn/Item/4624.aspx
http://kc.njitt.edu.cn/Item/4625.aspx
http://kc.njitt.edu.cn/Item/4626.aspx
http://kc.njitt.edu.cn/Item/4627.aspx
http://kc.njitt.edu.cn/Item/4628.aspx
http://kc.njitt.edu.cn/Item/4629.aspx
http://kc.njitt.edu.cn/Item/4630.aspx
http://kc.njitt.edu.cn/Item/4631.aspx
http://kc.njitt.edu.cn/Item/4632.aspx
http://kc.njitt.edu.cn/Item/4633.aspx
http://kc.njitt.edu.cn/Item/4634.aspx
http://kc.njitt.edu.cn/Item/4635.aspx
http://kc.njitt.edu.cn/Item/4636.aspx
http://kc.njitt.edu.cn/Item/4637.aspx
http://kc.njitt.edu.cn/Item/4638.aspx
http://kc.njitt.edu.cn/Item/4639.aspx
http://kc.njitt.edu.cn/Item/4640.aspx
http://kc.njitt.edu.cn/Item/4641.aspx
http://kc.njitt.edu.cn/Item/4642.aspx
http://kc.njitt.edu.cn/Item/4643.aspx
http://kc.njitt.edu.cn/Item/4644.aspx
http://kc.njitt.edu.cn/Item/4645.aspx
http://kc.njitt.edu.cn/Item/4646.aspx
http://kc.njitt.edu.cn/Item/4647.aspx
http://kc.njitt.edu.cn/Item/4648.aspx
http://kc.njitt.edu.cn/Item/4649.aspx
http://kc.njitt.edu.cn/Item/4650.aspx
http://kc.njitt.edu.cn/Item/4651.aspx
http://kc.njitt.edu.cn/Item/4652.aspx
http://kc.njitt.edu.cn/Item/4653.aspx
http://kc.njitt.edu.cn/Item/4654.aspx
http://kc.njitt.edu.cn/Item/4655.aspx
http://kc.njitt.edu.cn/Item/4656.aspx
http://kc.njitt.edu.cn/Item/4657.aspx
http://kc.njitt.edu.cn/Item/4658.aspx
http://kc.njitt.edu.cn/Item/4659.aspx
http://kc.njitt.edu.cn/Item/4660.aspx
http://kc.njitt.edu.cn/Item/4661.aspx
http://kc.njitt.edu.cn/Item/4662.aspx
http://kc.njitt.edu.cn/Item/4663.aspx
http://kc.njitt.edu.cn/Item/4664.aspx
http://kc.njitt.edu.cn/Item/4665.aspx
http://kc.njitt.edu.cn/Item/4666.aspx
http://kc.njitt.edu.cn/Item/4667.aspx
http://kc.njitt.edu.cn/Item/4668.aspx
http://kc.njitt.edu.cn/Item/4669.aspx
http://kc.njitt.edu.cn/Item/4670.aspx
http://kc.njitt.edu.cn/Item/4671.aspx
http://kc.njitt.edu.cn/Item/4672.aspx
http://kc.njitt.edu.cn/Item/4673.aspx
http://kc.njitt.edu.cn/Item/4674.aspx
http://kc.njitt.edu.cn/Item/4675.aspx
http://kc.njitt.edu.cn/Item/4676.aspx
http://kc.njitt.edu.cn/Item/4677.aspx
http://kc.njitt.edu.cn/Item/4678.aspx
http://kc.njitt.edu.cn/Item/4679.aspx
http://kc.njitt.edu.cn/Item/4680.aspx
http://kc.njitt.edu.cn/Item/4681.aspx
http://kc.njitt.edu.cn/Item/4682.aspx
http://kc.njitt.edu.cn/Item/4683.aspx
http://kc.njitt.edu.cn/Item/4684.aspx
http://kc.njitt.edu.cn/Item/4685.aspx
http://kc.njitt.edu.cn/Item/4686.aspx
http://kc.njitt.edu.cn/Item/4687.aspx
http://kc.njitt.edu.cn/Item/4688.aspx
http://kc.njitt.edu.cn/Item/4689.aspx
http://kc.njitt.edu.cn/Item/4690.aspx
http://kc.njitt.edu.cn/Item/4691.aspx
http://kc.njitt.edu.cn/Item/4692.aspx
http://kc.njitt.edu.cn/Item/4693.aspx
http://kc.njitt.edu.cn/Item/4694.aspx
http://kc.njitt.edu.cn/Item/4695.aspx
http://kc.njitt.edu.cn/Item/4696.aspx
http://kc.njitt.edu.cn/Item/4697.aspx
http://kc.njitt.edu.cn/Item/4698.aspx
http://kc.njitt.edu.cn/Item/4699.aspx
http://kc.njitt.edu.cn/Item/4700.aspx
http://kc.njitt.edu.cn/Item/4701.aspx
http://kc.njitt.edu.cn/Item/4702.aspx
http://kc.njitt.edu.cn/Item/4703.aspx
http://kc.njitt.edu.cn/Item/4704.aspx
http://kc.njitt.edu.cn/Item/4705.aspx
http://kc.njitt.edu.cn/Item/4706.aspx
http://kc.njitt.edu.cn/Item/4707.aspx
http://kc.njitt.edu.cn/Item/4708.aspx
http://kc.njitt.edu.cn/Item/4709.aspx
http://kc.njitt.edu.cn/Item/4710.aspx
http://kc.njitt.edu.cn/Item/4711.aspx
http://kc.njitt.edu.cn/Item/4712.aspx
http://kc.njitt.edu.cn/Item/4713.aspx
http://kc.njitt.edu.cn/Item/4714.aspx
http://kc.njitt.edu.cn/Item/4715.aspx
http://kc.njitt.edu.cn/Item/4716.aspx
http://kc.njitt.edu.cn/Item/4717.aspx
http://kc.njitt.edu.cn/Item/4718.aspx
http://kc.njitt.edu.cn/Item/4719.aspx
http://kc.njitt.edu.cn/Item/4720.aspx
http://kc.njitt.edu.cn/Item/4721.aspx
http://kc.njitt.edu.cn/Item/4722.aspx
http://kc.njitt.edu.cn/Item/4723.aspx
http://kc.njitt.edu.cn/Item/4724.aspx
http://kc.njitt.edu.cn/Item/4725.aspx
http://kc.njitt.edu.cn/Item/4726.aspx
http://kc.njitt.edu.cn/Item/4727.aspx
http://kc.njitt.edu.cn/Item/4728.aspx
http://kc.njitt.edu.cn/Item/4729.aspx
http://kc.njitt.edu.cn/Item/4730.aspx
http://kc.njitt.edu.cn/Item/4731.aspx
http://kc.njitt.edu.cn/Item/4732.aspx
http://kc.njitt.edu.cn/Item/4733.aspx
http://kc.njitt.edu.cn/Item/4734.aspx
http://kc.njitt.edu.cn/Item/4735.aspx
http://kc.njitt.edu.cn/Item/4736.aspx
http://kc.njitt.edu.cn/Item/4737.aspx
http://kc.njitt.edu.cn/Item/4738.aspx
http://kc.njitt.edu.cn/Item/4739.aspx
http://kc.njitt.edu.cn/Item/4740.aspx
http://kc.njitt.edu.cn/Item/4741.aspx
http://kc.njitt.edu.cn/Item/4742.aspx
http://kc.njitt.edu.cn/Item/4743.aspx
http://kc.njitt.edu.cn/Item/4744.aspx
http://kc.njitt.edu.cn/Item/4745.aspx
http://kc.njitt.edu.cn/Item/4746.aspx
http://kc.njitt.edu.cn/Item/4747.aspx
http://kc.njitt.edu.cn/Item/4748.aspx
http://kc.njitt.edu.cn/Item/4749.aspx
http://kc.njitt.edu.cn/Item/4750.aspx
http://kc.njitt.edu.cn/Item/4751.aspx
http://kc.njitt.edu.cn/Item/4752.aspx
http://kc.njitt.edu.cn/Item/4753.aspx
http://kc.njitt.edu.cn/Item/4754.aspx
http://kc.njitt.edu.cn/Item/4755.aspx
http://kc.njitt.edu.cn/Item/4756.aspx
http://kc.njitt.edu.cn/Item/4757.aspx
http://kc.njitt.edu.cn/Item/4758.aspx
http://kc.njitt.edu.cn/Item/4759.aspx
http://kc.njitt.edu.cn/Item/4760.aspx
http://kc.njitt.edu.cn/Item/4761.aspx
http://kc.njitt.edu.cn/Item/4762.aspx
http://kc.njitt.edu.cn/Item/4763.aspx
http://kc.njitt.edu.cn/Item/4764.aspx
http://kc.njitt.edu.cn/Item/4765.aspx
http://kc.njitt.edu.cn/Item/4766.aspx
http://kc.njitt.edu.cn/Item/4767.aspx
http://kc.njitt.edu.cn/Item/4768.aspx
http://kc.njitt.edu.cn/Item/4769.aspx
http://kc.njitt.edu.cn/Item/4770.aspx
http://kc.njitt.edu.cn/Item/4771.aspx
http://kc.njitt.edu.cn/Item/4772.aspx
http://kc.njitt.edu.cn/Item/4773.aspx
http://kc.njitt.edu.cn/Item/4774.aspx
http://kc.njitt.edu.cn/Item/4775.aspx
http://kc.njitt.edu.cn/Item/4776.aspx
http://kc.njitt.edu.cn/Item/4777.aspx
http://kc.njitt.edu.cn/Item/4778.aspx
http://kc.njitt.edu.cn/Item/4779.aspx
http://kc.njitt.edu.cn/Item/4780.aspx
http://kc.njitt.edu.cn/Item/4781.aspx
http://kc.njitt.edu.cn/Item/4782.aspx
http://kc.njitt.edu.cn/Item/4783.aspx
http://kc.njitt.edu.cn/Item/4784.aspx
http://kc.njitt.edu.cn/Item/4785.aspx
http://kc.njitt.edu.cn/Item/4786.aspx
http://kc.njitt.edu.cn/Item/4787.aspx
http://kc.njitt.edu.cn/Item/4788.aspx
http://kc.njitt.edu.cn/Item/4789.aspx
http://kc.njitt.edu.cn/Item/4790.aspx
http://kc.njitt.edu.cn/Item/4791.aspx
http://kc.njitt.edu.cn/Item/4792.aspx
http://kc.njitt.edu.cn/Item/4793.aspx
http://kc.njitt.edu.cn/Item/4794.aspx
http://kc.njitt.edu.cn/Item/4795.aspx
http://kc.njitt.edu.cn/Item/4796.aspx
http://kc.njitt.edu.cn/Item/4797.aspx
http://kc.njitt.edu.cn/Item/4798.aspx
http://kc.njitt.edu.cn/Item/4799.aspx
http://kc.njitt.edu.cn/Item/4800.aspx
http://kc.njitt.edu.cn/Item/4801.aspx
http://kc.njitt.edu.cn/Item/4802.aspx
http://kc.njitt.edu.cn/Item/4803.aspx
http://kc.njitt.edu.cn/Item/4804.aspx
http://kc.njitt.edu.cn/Item/4805.aspx
http://kc.njitt.edu.cn/Item/4806.aspx
http://kc.njitt.edu.cn/Item/4807.aspx
http://kc.njitt.edu.cn/Item/4808.aspx
http://kc.njitt.edu.cn/Item/4809.aspx
http://kc.njitt.edu.cn/Item/4810.aspx
http://kc.njitt.edu.cn/Item/4811.aspx
http://kc.njitt.edu.cn/Item/4812.aspx
http://kc.njitt.edu.cn/Item/4813.aspx
http://kc.njitt.edu.cn/Item/4814.aspx
http://kc.njitt.edu.cn/Item/4815.aspx
http://kc.njitt.edu.cn/Item/4816.aspx
http://kc.njitt.edu.cn/Item/4817.aspx
http://kc.njitt.edu.cn/Item/4818.aspx
http://kc.njitt.edu.cn/Item/4819.aspx
http://kc.njitt.edu.cn/Item/4820.aspx
http://kc.njitt.edu.cn/Item/4821.aspx
http://kc.njitt.edu.cn/Item/4822.aspx
http://kc.njitt.edu.cn/Item/4823.aspx
http://kc.njitt.edu.cn/Item/4824.aspx
http://kc.njitt.edu.cn/Item/4825.aspx
http://kc.njitt.edu.cn/Item/4826.aspx
http://kc.njitt.edu.cn/Item/4827.aspx
http://kc.njitt.edu.cn/Item/4828.aspx
http://kc.njitt.edu.cn/Item/4829.aspx
http://kc.njitt.edu.cn/Item/4830.aspx
http://kc.njitt.edu.cn/Item/4831.aspx
http://kc.njitt.edu.cn/Item/4832.aspx
http://kc.njitt.edu.cn/Item/4833.aspx
http://kc.njitt.edu.cn/Item/4834.aspx
http://kc.njitt.edu.cn/Item/4835.aspx
http://kc.njitt.edu.cn/Item/4836.aspx
http://kc.njitt.edu.cn/Item/4837.aspx
http://kc.njitt.edu.cn/Item/4838.aspx
http://kc.njitt.edu.cn/Item/4839.aspx
http://kc.njitt.edu.cn/Item/4840.aspx
http://kc.njitt.edu.cn/Item/4841.aspx
http://kc.njitt.edu.cn/Item/4842.aspx
http://kc.njitt.edu.cn/Item/4843.aspx
http://kc.njitt.edu.cn/Item/4844.aspx
http://kc.njitt.edu.cn/Item/4845.aspx
http://kc.njitt.edu.cn/Item/4846.aspx
http://kc.njitt.edu.cn/Item/4847.aspx
http://kc.njitt.edu.cn/Item/4848.aspx
http://kc.njitt.edu.cn/Item/4849.aspx
http://kc.njitt.edu.cn/Item/4850.aspx
http://kc.njitt.edu.cn/Item/4851.aspx
http://kc.njitt.edu.cn/Item/4852.aspx
http://kc.njitt.edu.cn/Item/4853.aspx
http://kc.njitt.edu.cn/Item/4854.aspx
http://kc.njitt.edu.cn/Item/4855.aspx
http://kc.njitt.edu.cn/Item/4856.aspx
http://kc.njitt.edu.cn/Item/4857.aspx
http://kc.njitt.edu.cn/Item/4858.aspx
http://kc.njitt.edu.cn/Item/4859.aspx
http://kc.njitt.edu.cn/Item/4860.aspx
http://kc.njitt.edu.cn/Item/4861.aspx
http://kc.njitt.edu.cn/Item/4862.aspx
http://kc.njitt.edu.cn/Item/4863.aspx
http://kc.njitt.edu.cn/Item/4864.aspx
http://kc.njitt.edu.cn/Item/4865.aspx
http://kc.njitt.edu.cn/Item/4866.aspx
http://kc.njitt.edu.cn/Item/4867.aspx
http://kc.njitt.edu.cn/Item/4868.aspx
http://kc.njitt.edu.cn/Item/4869.aspx
http://kc.njitt.edu.cn/Item/4870.aspx
http://kc.njitt.edu.cn/Item/4871.aspx
http://kc.njitt.edu.cn/Item/4872.aspx
http://kc.njitt.edu.cn/Item/4873.aspx
http://kc.njitt.edu.cn/Item/4874.aspx
http://kc.njitt.edu.cn/Item/4875.aspx
http://kc.njitt.edu.cn/Item/4876.aspx
http://kc.njitt.edu.cn/Item/4877.aspx
http://kc.njitt.edu.cn/Item/4878.aspx
http://kc.njitt.edu.cn/Item/4879.aspx
http://kc.njitt.edu.cn/Item/4880.aspx
http://kc.njitt.edu.cn/Item/4881.aspx
http://kc.njitt.edu.cn/Item/4882.aspx
http://kc.njitt.edu.cn/Item/4883.aspx
http://kc.njitt.edu.cn/Item/4884.aspx
http://kc.njitt.edu.cn/Item/4885.aspx
http://kc.njitt.edu.cn/Item/4886.aspx
http://kc.njitt.edu.cn/Item/4887.aspx
http://kc.njitt.edu.cn/Item/4888.aspx
http://kc.njitt.edu.cn/Item/4889.aspx
http://kc.njitt.edu.cn/Item/4890.aspx
http://kc.njitt.edu.cn/Item/4891.aspx
http://kc.njitt.edu.cn/Item/4892.aspx
http://kc.njitt.edu.cn/Item/4893.aspx
http://kc.njitt.edu.cn/Item/4894.aspx
http://kc.njitt.edu.cn/Item/4895.aspx
http://kc.njitt.edu.cn/Item/4896.aspx
http://kc.njitt.edu.cn/Item/4897.aspx
http://kc.njitt.edu.cn/Item/4898.aspx
http://kc.njitt.edu.cn/Item/4899.aspx
http://kc.njitt.edu.cn/Item/4900.aspx
http://kc.njitt.edu.cn/Item/4901.aspx
http://kc.njitt.edu.cn/Item/4902.aspx
http://kc.njitt.edu.cn/Item/4903.aspx
http://kc.njitt.edu.cn/Item/4904.aspx
http://kc.njitt.edu.cn/Item/4905.aspx
http://kc.njitt.edu.cn/Item/4906.aspx
http://kc.njitt.edu.cn/Item/4907.aspx
http://kc.njitt.edu.cn/Item/4908.aspx
http://kc.njitt.edu.cn/Item/4909.aspx
http://kc.njitt.edu.cn/Item/4910.aspx
http://kc.njitt.edu.cn/Item/4911.aspx
http://kc.njitt.edu.cn/Item/4912.aspx
http://kc.njitt.edu.cn/Item/4913.aspx
http://kc.njitt.edu.cn/Item/4914.aspx
http://kc.njitt.edu.cn/Item/4915.aspx
http://kc.njitt.edu.cn/Item/4916.aspx
http://kc.njitt.edu.cn/Item/4917.aspx
http://kc.njitt.edu.cn/Item/4918.aspx
http://kc.njitt.edu.cn/Item/4919.aspx
http://kc.njitt.edu.cn/Item/4920.aspx
http://kc.njitt.edu.cn/Item/4921.aspx
http://kc.njitt.edu.cn/Item/4922.aspx
http://kc.njitt.edu.cn/Item/4923.aspx
http://kc.njitt.edu.cn/Item/4924.aspx
http://kc.njitt.edu.cn/Item/4925.aspx
http://kc.njitt.edu.cn/Item/4926.aspx
http://kc.njitt.edu.cn/Item/4927.aspx
http://kc.njitt.edu.cn/Item/4928.aspx
http://kc.njitt.edu.cn/Item/4929.aspx
http://kc.njitt.edu.cn/Item/4930.aspx
http://kc.njitt.edu.cn/Item/4931.aspx
http://kc.njitt.edu.cn/Item/4932.aspx
http://kc.njitt.edu.cn/Item/4933.aspx
http://kc.njitt.edu.cn/Item/4934.aspx
http://kc.njitt.edu.cn/Item/4935.aspx
http://kc.njitt.edu.cn/Item/4936.aspx
http://kc.njitt.edu.cn/Item/4937.aspx
http://kc.njitt.edu.cn/Item/4938.aspx
http://kc.njitt.edu.cn/Item/4939.aspx
http://kc.njitt.edu.cn/Item/4940.aspx
http://kc.njitt.edu.cn/Item/4941.aspx
http://kc.njitt.edu.cn/Item/4942.aspx
http://kc.njitt.edu.cn/Item/4943.aspx
http://kc.njitt.edu.cn/Item/4944.aspx
http://kc.njitt.edu.cn/Item/4945.aspx
http://kc.njitt.edu.cn/Item/4946.aspx
http://kc.njitt.edu.cn/Item/4947.aspx
http://kc.njitt.edu.cn/Item/4948.aspx
http://kc.njitt.edu.cn/Item/4949.aspx
http://kc.njitt.edu.cn/Item/4950.aspx
http://kc.njitt.edu.cn/Item/4951.aspx
http://kc.njitt.edu.cn/Item/4952.aspx
http://kc.njitt.edu.cn/Item/4953.aspx
http://kc.njitt.edu.cn/Item/4954.aspx
http://kc.njitt.edu.cn/Item/4955.aspx
http://kc.njitt.edu.cn/Item/4956.aspx
http://kc.njitt.edu.cn/Item/4957.aspx
http://kc.njitt.edu.cn/Item/4958.aspx
http://kc.njitt.edu.cn/Item/4959.aspx
http://kc.njitt.edu.cn/Item/4960.aspx
http://kc.njitt.edu.cn/Item/4961.aspx
http://kc.njitt.edu.cn/Item/4962.aspx
http://kc.njitt.edu.cn/Item/4963.aspx
http://kc.njitt.edu.cn/Item/4964.aspx
http://kc.njitt.edu.cn/Item/4965.aspx
http://kc.njitt.edu.cn/Item/4966.aspx
http://kc.njitt.edu.cn/Item/4967.aspx
http://kc.njitt.edu.cn/Item/4968.aspx
http://kc.njitt.edu.cn/Item/4969.aspx
http://kc.njitt.edu.cn/Item/4970.aspx
http://kc.njitt.edu.cn/Item/4971.aspx
http://kc.njitt.edu.cn/Item/4972.aspx
http://kc.njitt.edu.cn/Item/4973.aspx
http://kc.njitt.edu.cn/Item/4974.aspx
http://kc.njitt.edu.cn/Item/4975.aspx
http://kc.njitt.edu.cn/Item/4976.aspx
http://kc.njitt.edu.cn/Item/4977.aspx
http://kc.njitt.edu.cn/Item/4978.aspx
http://kc.njitt.edu.cn/Item/4979.aspx
http://kc.njitt.edu.cn/Item/4980.aspx
http://kc.njitt.edu.cn/Item/4981.aspx
http://kc.njitt.edu.cn/Item/4982.aspx
http://kc.njitt.edu.cn/Item/4983.aspx
http://kc.njitt.edu.cn/Item/4984.aspx
http://kc.njitt.edu.cn/Item/4985.aspx
http://kc.njitt.edu.cn/Item/4986.aspx
http://kc.njitt.edu.cn/Item/4987.aspx
http://kc.njitt.edu.cn/Item/4988.aspx
http://kc.njitt.edu.cn/Item/4989.aspx
http://kc.njitt.edu.cn/Item/4990.aspx
http://kc.njitt.edu.cn/Item/4991.aspx
http://kc.njitt.edu.cn/Item/4992.aspx
http://kc.njitt.edu.cn/Item/4993.aspx
http://kc.njitt.edu.cn/Item/4994.aspx
http://kc.njitt.edu.cn/Item/4995.aspx
http://kc.njitt.edu.cn/Item/4996.aspx
http://kc.njitt.edu.cn/Item/4997.aspx
http://kc.njitt.edu.cn/Item/4998.aspx
http://kc.njitt.edu.cn/Item/4999.aspx
http://kc.njitt.edu.cn/Item/5000.aspx
http://kc.njitt.edu.cn/Item/5001.aspx
http://kc.njitt.edu.cn/Item/5002.aspx
http://kc.njitt.edu.cn/Item/5003.aspx
http://kc.njitt.edu.cn/Item/5004.aspx
http://kc.njitt.edu.cn/Item/5005.aspx
http://kc.njitt.edu.cn/Item/5006.aspx
http://kc.njitt.edu.cn/Item/5007.aspx
http://kc.njitt.edu.cn/Item/5008.aspx
http://kc.njitt.edu.cn/Item/5009.aspx
http://kc.njitt.edu.cn/Item/5010.aspx
http://kc.njitt.edu.cn/Item/5011.aspx
http://kc.njitt.edu.cn/Item/5012.aspx
http://kc.njitt.edu.cn/Item/5013.aspx
http://kc.njitt.edu.cn/Item/5014.aspx
http://kc.njitt.edu.cn/Item/5015.aspx
http://kc.njitt.edu.cn/Item/5016.aspx
http://kc.njitt.edu.cn/Item/5017.aspx
http://kc.njitt.edu.cn/Item/5018.aspx
http://kc.njitt.edu.cn/Item/5019.aspx
http://kc.njitt.edu.cn/Item/5020.aspx
http://kc.njitt.edu.cn/Item/5021.aspx
http://kc.njitt.edu.cn/Item/5022.aspx
http://kc.njitt.edu.cn/Item/5023.aspx
http://kc.njitt.edu.cn/Item/5024.aspx
http://kc.njitt.edu.cn/Item/5025.aspx
http://kc.njitt.edu.cn/Item/5026.aspx
http://kc.njitt.edu.cn/Item/5027.aspx
http://kc.njitt.edu.cn/Item/5028.aspx
http://kc.njitt.edu.cn/Item/5029.aspx
http://kc.njitt.edu.cn/Item/5030.aspx
http://kc.njitt.edu.cn/Item/5031.aspx
http://kc.njitt.edu.cn/Item/5032.aspx
http://kc.njitt.edu.cn/Item/5033.aspx
http://kc.njitt.edu.cn/Item/5034.aspx
http://kc.njitt.edu.cn/Item/5035.aspx
http://kc.njitt.edu.cn/Item/5036.aspx
http://kc.njitt.edu.cn/Item/5037.aspx
http://kc.njitt.edu.cn/Item/5038.aspx
http://kc.njitt.edu.cn/Item/5039.aspx
http://kc.njitt.edu.cn/Item/5040.aspx
http://kc.njitt.edu.cn/Item/5041.aspx
http://kc.njitt.edu.cn/Item/5042.aspx
http://kc.njitt.edu.cn/Item/5043.aspx
http://kc.njitt.edu.cn/Item/5044.aspx
http://kc.njitt.edu.cn/Item/5045.aspx
http://kc.njitt.edu.cn/Item/5046.aspx
http://kc.njitt.edu.cn/Item/5047.aspx
http://kc.njitt.edu.cn/Item/5048.aspx
http://kc.njitt.edu.cn/Item/5049.aspx
http://kc.njitt.edu.cn/Item/5050.aspx
http://kc.njitt.edu.cn/Item/5051.aspx
http://kc.njitt.edu.cn/Item/5052.aspx
http://kc.njitt.edu.cn/Item/5053.aspx
http://kc.njitt.edu.cn/Item/5054.aspx
http://kc.njitt.edu.cn/Item/5055.aspx
http://kc.njitt.edu.cn/Item/5056.aspx
http://kc.njitt.edu.cn/Item/5057.aspx
http://kc.njitt.edu.cn/Item/5058.aspx
http://kc.njitt.edu.cn/Item/5059.aspx
http://kc.njitt.edu.cn/Item/5060.aspx
http://kc.njitt.edu.cn/Item/5061.aspx
http://kc.njitt.edu.cn/Item/5062.aspx
http://kc.njitt.edu.cn/Item/5063.aspx
http://kc.njitt.edu.cn/Item/5064.aspx
http://kc.njitt.edu.cn/Item/5065.aspx
http://kc.njitt.edu.cn/Item/5066.aspx
http://kc.njitt.edu.cn/Item/5067.aspx
http://kc.njitt.edu.cn/Item/5068.aspx
http://kc.njitt.edu.cn/Item/5069.aspx
http://kc.njitt.edu.cn/Item/5070.aspx
http://kc.njitt.edu.cn/Item/5071.aspx
http://kc.njitt.edu.cn/Item/5072.aspx
http://kc.njitt.edu.cn/Item/5073.aspx
http://kc.njitt.edu.cn/Item/5074.aspx
http://kc.njitt.edu.cn/Item/5075.aspx
http://kc.njitt.edu.cn/Item/5076.aspx
http://kc.njitt.edu.cn/Item/5077.aspx
http://kc.njitt.edu.cn/Item/5078.aspx
http://kc.njitt.edu.cn/Item/5079.aspx
http://kc.njitt.edu.cn/Item/5080.aspx
http://kc.njitt.edu.cn/Item/5081.aspx
http://kc.njitt.edu.cn/Item/5082.aspx
http://kc.njitt.edu.cn/Item/5083.aspx
http://kc.njitt.edu.cn/Item/5084.aspx
http://kc.njitt.edu.cn/Item/5085.aspx
http://kc.njitt.edu.cn/Item/5086.aspx
http://kc.njitt.edu.cn/Item/5087.aspx
http://kc.njitt.edu.cn/Item/5088.aspx
http://kc.njitt.edu.cn/Item/5089.aspx
http://kc.njitt.edu.cn/Item/5090.aspx
http://kc.njitt.edu.cn/Item/5091.aspx
http://kc.njitt.edu.cn/Item/5092.aspx
http://kc.njitt.edu.cn/Item/5093.aspx
http://kc.njitt.edu.cn/Item/5094.aspx
http://kc.njitt.edu.cn/Item/5095.aspx
五、文件配置源配置更新原理
对于文件配置源,.NET Core默认提供了两个抽象类:FileConfigurationSource 和 FileConfigurationProvider

public abstract class FileConfigurationProvider : ConfigurationProvider, IDisposable
{
private readonly IDisposable _changeTokenRegistration;

public FileConfigurationProvider(FileConfigurationSource source)
{
	if (source == null)
	{
		throw new ArgumentNullException(nameof(source));
	}
	Source = source;

	if (Source.ReloadOnChange && Source.FileProvider != null)
	{
		_changeTokenRegistration = ChangeToken.OnChange(	// 文件改变,重新加载配置
			() => Source.FileProvider.Watch(Source.Path),
			() =>
			{
				Thread.Sleep(Source.ReloadDelay);
				Load(reload: true);
			});
	}
}

/// <summary>
/// The source settings for this provider.
/// </summary>
public FileConfigurationSource Source { get; }


private void Load(bool reload)
{
	IFileInfo file = Source.FileProvider?.GetFileInfo(Source.Path);
	if (file == null || !file.Exists)
	{
		if (Source.Optional || reload) // Always optional on reload
		{
			Data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);	// Data 被重新创建新的实例赋值了
		}
		else
		{
			var error = new StringBuilder($"The configuration file '{Source.Path}' was not found and is not optional.");
			if (!string.IsNullOrEmpty(file?.PhysicalPath))
			{
				error.Append($" The physical path is '{file.PhysicalPath}'.");
			}
			HandleException(ExceptionDispatchInfo.Capture(new FileNotFoundException(error.ToString())));
		}
	}
	else
	{
		// Always create new Data on reload to drop old keys
		if (reload)
		{
			Data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);	// Data 被重新创建新的实例赋值了
		}

		static Stream OpenRead(IFileInfo fileInfo)
		{
			if (fileInfo.PhysicalPath != null)
			{
				// The default physical file info assumes asynchronous IO which results in unnecessary overhead
				// especally since the configuration system is synchronous. This uses the same settings
				// and disables async IO.
				return new FileStream(
					fileInfo.PhysicalPath,
					FileMode.Open,
					FileAccess.Read,
					FileShare.ReadWrite,
					bufferSize: 1,
					FileOptions.SequentialScan);
			}

			return fileInfo.CreateReadStream();
		}

		using Stream stream = OpenRead(file);
		try
		{
			Load(stream);
		}
		catch (Exception e)
		{
			HandleException(ExceptionDispatchInfo.Capture(e));
		}
	}
}

public override void Load()
{
	Load(reload: false);
}

public abstract void Load(Stream stream);

}
所有基于文件配置源(如果要监控配置文件更新,如:appsetting.json)都应实现这个两个抽象类,尽管不懂ChangeToken是个什么东东,只需明白Provider.Data 在文件变更时被重新赋值也未尝不可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值