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 可以帮助你 ...
随机推荐
- Task 笔记
1.计时器类Stopwatch Stopwatch stopwatch=new Stopwatch() stopwatch.Start();//开始计时 stopwatch.Stop();//停止计时 ...
- Epic Games Launcher 提示 应用程序无法正常启动(0xc000007b)
事件起因: 在给某同事安装Epic Games Launcher报错, 提示 应用程序无法正常启动(0xc000007b) 解决办法: 用DirectX修复工具扫一下,修复一下C++插件,一般是由于 ...
- eBPF 概述:第 1 部分:介绍
1. 前言 有兴趣了解更多关于 eBPF 技术的底层细节?那么请继续移步,我们将深入研究 eBPF 的底层细节,从其虚拟机机制和工具,到在远程资源受限的嵌入式设备上运行跟踪. 注意:本系列博客文章将集 ...
- JOI 2020 Final
A - 長いだけのネクタイ (Just Long Neckties) JOI 公司开了一个派对.有 \(n + 1\) 条领带,第 \(i\) 条领带的长度是 \(a_i\).有 \(n\) 名员工, ...
- 妙用编辑器:把EverEdit变成计算器
妙用编辑器:把EverEdit变成计算器 应用场景 日常工作过程中,会存在需要计算一些数据的场景,调用系统的计算器当然可以完成这项工作,但是需要来回切换,且系统自带的计算器没有表达式计算功能,真是不方 ...
- appium-命令行启动appium-server(windows)
首先找到build\lib\main.js所在位置,我用的工具是everything(推荐一波),比windows自带的搜索强太多 执行命令:node C:\Users\Acer\AppData\Ro ...
- Nuxt.js 应用中的 build:manifest 事件钩子详解
title: Nuxt.js 应用中的 build:manifest 事件钩子详解 date: 2024/10/22 updated: 2024/10/22 author: cmdragon exce ...
- HTB打靶记录-Infiltrator
nmap scan nmap -A 10.10.11.31 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-15 13:18 CST Nma ...
- manim边学边做--通用二维坐标系
Manim的Axes对象是通用的坐标系对象,之前几篇介绍的数轴和各种坐标平面都是继承Axes对象. Axes对象的主要作用在于创建和管理二维坐标轴,以满足我们制作数学动画时的各种需求. 具体来说,Ax ...
- chapter1 events and probability
第一章 事件和概率 1.1 Appication: verifying polynomial identities 1.2 Axioms of probability 1.3 Application ...