ASP.NET Core: ConfigurationBuilder
在 ASP.NET Core 中,大量使用了建造模式 Builer,从类型的名称就可以看出来这一点,例如 HostBuilder、ConfigurationBuilder 等等。
建造模式是对象的创建模式,建造模式可以将一个产品的内部实现与产品的生成过程分离开来。从而可以使一个建造过程生成具有不同的内部表象的产品对象。使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品的对应零件彼此有何不同,是怎样建造出来的,以及怎样组成产品。
建造模式的 UML 如下所示:

秒懂设计模式之建造者模式(Builder pattern 对建造模式有深入的说明。
下面以 Host 的 Configuration 为例进行说明。
Host 中内部的 BuildHostConfiguration() 用来构建宿主 Host 的配置信息,它又是如何与提供给用户的扩展接口 IHostBuilder ConfigureHostConfiguration(Action configureDelegate) 结合起来的呢?
在 HostBuilder 内部,定义了一个用来保存宿主配置信息的字段 _hostConfiguration,它是实际的配置对象。但是,我们只是在内部使用它,而不把它暴露出来供用户直接配置。
private IConfiguration _hostConfiguration;
我们可以先看一看在 HostBuilder 内部的 BuildHostConfiguration() 方法实现,在 GitHub 中查看 HostBuilder 源码。
private void BuildHostConfiguration()
{
var configBuilder = new ConfigurationBuilder()
.AddInMemoryCollection(); // Make sure there's some default storage since there are no default providers
foreach (var buildAction in _configureHostConfigActions)
{
buildAction(configBuilder);
}
_hostConfiguration = configBuilder.Build();
}
可以看到,内部创建了一个 ConfigurationBuilder 的实例,然后将它作为参数,依此调用我们提供的 Action 委托实例。 最终,调用这个 ConfigurationBuilder 的 Build() 方法构建出配置对象 IConfiguration 。
我们的代码实际上是通过处理这个 IConfigurationBuilder 来进行配置的。这样在配置的时候,是通过这个暴露出来的 IConfigurationBuilder 来进行配置的。
IConfigurationBuilder
ConfigurationBuilder 实现了 IConfigurationBuilder 接口,在 GitHub 中查看 IConfigurationBuilder 源码。这个接口提供了管理配置的方法和属性。同时,还可以通过它的扩展方法进行配置。
public interface IConfigurationBuilder {
/// <summary>
/// Gets a key/value collection that can be used to share data between the <see cref="IConfigurationBuilder"/>
/// and the registered <see cref="IConfigurationSource"/>s.
/// </summary>
IDictionary<string, object> Properties { get; }
/// <summary>
/// Gets the sources used to obtain configuration values
/// </summary>
IList<IConfigurationSource> Sources { get; }
/// <summary>
/// Adds a new configuration source.
/// </summary>
IConfigurationBuilder Add (IConfigurationSource source);
/// <summary>
/// Builds an <see cref="IConfiguration"/> with keys and values from the set of sources registered in
/// <see cref="Sources"/>.
/// </summary>
IConfigurationRoot Build ();
}
ConfigurationBuilder
在 GitHub 中查看 ConfigurationBuilder 源码。
namespace Microsoft.Extensions.Configuration {
public class ConfigurationBuilder : IConfigurationBuilder {
public IList<IConfigurationSource> Sources { get; } = new List<IConfigurationSource> ();
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 (IConfigurationSource source in Sources) {
IConfigurationProvider provider = source.Build (this);
providers.Add (provider);
}
return new ConfigurationRoot (providers);
}
}
}
应用
在 Host 中,我们看到过这样的代码,在 GitHub 中查看 Host 源码。
builder.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables(prefix: "DOTNET_");
if (args != null)
{
config.AddCommandLine(args);
}
});
这个 AddEnvironmentVariables() 是一个扩展方法,在 GitHub 中查看 EnvironmentVariablesExtensions 源码。
public static IConfigurationBuilder AddEnvironmentVariables(
this IConfigurationBuilder configurationBuilder,
string prefix)
{
configurationBuilder.Add(new EnvironmentVariablesConfigurationSource { Prefix = prefix });
return configurationBuilder;
}
最终调用了 ConfigurationBuilder 的 Add() 方法。
需要注意的是,这个方法最终返回了 configurationBuilder 对象本身,所以,我们可以使用链式调用来进行进一步的配置。
在 GitHub 中查看 EnvironmentVariablesConfigurationSource 源码
ASP.NET Core: ConfigurationBuilder的更多相关文章
- 第11章 配置ASP.NET Core应用程序(ASP.NET Core in Action, 2nd Edition)
本章包括 从多个配置提供程序加载设置 安全存储敏感设置 使用强类型设置对象 在不同的宿主环境中使用不同的设置 在本书的第1部分中,您学习了ASP.NET Core应用程序启动和运行的基础知识,以及如何 ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?
注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...
- 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位
ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
随机推荐
- Vue 文件流预览 PDF
Vue js // pdf 预览 export function download(id) { return request({ url: '/bbs/regtech/law/download?id= ...
- 高通ADSP USB流程
在高通平台上,ADSP(Audio Digital Signal Processor,音频数字信号处理器)可以通过 USB 接口与主机进行数据传输,以下是大致的 ADSP USB 流程: 主机发起 U ...
- iOS工厂模式使用小结
一.什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行.工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好 ...
- maven的pom.xml基础配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- package.json文件干什么的 ?
package.json 是项目描述文件,记录了当前项目的信息,比如项目的名字,版本,作者,还有所依赖的第三方模块 : dependencies 是项目依赖,是项目上线时要依赖的第三方包 : devd ...
- OpenAI官方开源多智能体框架「Swarm」,并不是我想要的多智能体框架
今天早上,OpenAI实施团队的 @shyamal在Github上开源了Swarm这个OpenAI官方的多智能体框架.不得不说,OpenAI官方下场,获得的社区影响就是不一样,在微信群.朋友圈里已经出 ...
- KubeSphere 社区双周报 | 4.8 深圳站 Meetup 火热报名中 | 2023.3.17-3.30
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Solution of CF1842C
Brief description of the title 若 \(a_i=a_j\) 且 \(1\le i < j\le |a|\).则删除 \(a_{i}\) 到 \(a_j\) 所有数. ...
- Machine Learning Week_1 Linear Algebra Review 1-6
目录 4 Linear Algebra Review 4.1 Video: Matrices and Vectors unfamiliar words 4.2 Reading: Matrices an ...
- Java中List 删除元素
在Java中,使用List时想要删除某个特定个元素怎么办?很好办!因为List接口有remove()这个方法,我们只需要调用remove()方法,就可以删除list中的某个元素.但是list自带的有一 ...