在 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的更多相关文章

  1. 第11章 配置ASP.NET Core应用程序(ASP.NET Core in Action, 2nd Edition)

    本章包括 从多个配置提供程序加载设置 安全存储敏感设置 使用强类型设置对象 在不同的宿主环境中使用不同的设置 在本书的第1部分中,您学习了ASP.NET Core应用程序启动和运行的基础知识,以及如何 ...

  2. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  3. ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求

    我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...

  4. 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

    HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...

  5. 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?

    注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...

  6. 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位

    ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...

  7. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  8. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  9. ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器

    原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...

  10. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

随机推荐

  1. 第17天:信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等

    框架:简单代码的一个整合库,如果使用框架就只需要学习使用框架调用即可 如:文件上传功能是需要很多代码来实现的,框架把这个代码进行封封装,调用即可 影响:如果采用框架开发,代码的安全性是取决于框架的过滤 ...

  2. KubeSphere 社区双周报 | KubeSphere 多项更新 | 2023.06.23-07.06

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  3. KubeSphere 社区双周报 | KubeKey v3.0.7 发布 | 2023-02-03

    KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...

  4. 想玩Steam游戏,但配置太低?ToDesk云电脑一招搞定!

    在游戏爱好者的世界里,汇集了许多游戏大作的Steam平台无疑是一座宝库.但对于许多玩家来说,拥有一颗渴望畅玩游戏的心,却常常被低配置的电脑设备所束缚.尤其是面对硬件要求极高的3A大作时,低配置的电脑往 ...

  5. Machine Learning Week_3 Classification Model

    目录 1 Classification and Representation 1.1 Classification unfamiliar words 1.2 Hypothesis Representa ...

  6. 今日一学,5道大厂的Java基础面试题

    前言 各种框架眼花缭乱,各种逻辑需求,CRUD.久而久之,写的1000行代码中都是if else,@autowired等等,等出去面试的时候,基础题不断,而且还是不常用,或者说不在意的,往往这些就容易 ...

  7. CF939 D

    CF939 D 让你把区间分成 \(k\) 段, 段内用 \(xor\) 连接, 段之间用 \(or\) 连接,问你在结果不大于 \(x\) 的前提下, \(k\) 的最大值 \(1 \leq n \ ...

  8. 认识鸿蒙Context

    Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理).applicationInfo(当前应用信息).dir(应用文件路径).area(文件分 ...

  9. 流程编排LiteFlow-业务代码解耦

    LiteFlow真的是相见恨晚啊,之前做过的很多系统,都会用各种if else,switch这些来解决不同业务方提出的问题,有时候还要"切一个分支"来搞这些额外的事情,把代码搞得一 ...

  10. UE4纯C++实现游戏快捷栏之物品读取

    我们在上一步骤中创建了快捷栏的UI界面,在这一部分我们将从Json文件中读取物品的相关信息(种类以及属性),来填充到游戏数据中进行存储以便快捷栏使用,具体分以下几部分完成. 1.Types.h: 添加 ...