.NET Core 开发实战
  • 目录
  • 第1课:课程介绍
  • 第2课:内容综述
  • 第3课:.NET Core的现状、未来以及环境搭建
  • 第4课:Startup:掌握ASP.NET Core的启动过程
  • 第5课:依赖注入:良好架构的起点
  • 第6课:作用域与对象释放行为
  • 第7课:用Autofac增强容器能力
  • 第8课:配置框架:让服务无缝适应各种环境
  • 第9课:命令行配置提供程序
  • 第10课:环境变量配置提供程序
  • 第11课:文件配置提供程序
  • 第12课:配置变更监听
  • 第13课:配置绑定:使用强类型对象承载配置数据
  • 第14课:自定义配置数据源:低成本实现定制化配置方案
  • 第15课:选项框架:服务组件集成配置的最佳实践
  • 第16课:选项数据热更新:让服务感知配置的变化
  • 第17课:为选项数据添加验证:避免错误配置的应用接收用户流量
  • 第18课:日志框架:聊聊记日志的最佳姿势
  • 第19课:日志作用域:解决不同请求之间的日志干扰
  • 第20课:结构化日志组件Serilog:记录对查询分析友好的日志
  • 第21课:中间件:掌控请求处理过程的关键
  • 第22课:异常处理中间件:区分真异常与逻辑异常
  • 第23课:静态文件中间件:前后端分离开发合并部署骚操作
  • 第24课:文件提供程序:让你可以将文件放在任何地方
  • 第25课:路由与终结点:如何规划好你的Web API
  • 第26课:工程结构概览:定义应用分层及依赖关系
  • 第27课:定义Entity:区分领域模型的内在逻辑和外在行为
  • 第28课:工作单元模式(UnitOfWork):管理好你的事务
  • 第29课:定义仓储:使用EF Core实现仓储层
  • 第30课:领域事件:提升业务内聚,实现模块解耦
  • 第31课:APIController:定义API的最佳实践
  • 第32课:集成事件:解决跨微服务的最终一致性
  • 第33课:集成事件:使用RabbitMQ来实现EventBus
  • 第34课:MediatR:轻松实现命令查询职责分离模式(CQRS)
  • 第35课:MediatR:让领域事件处理更加优雅
Powered by GitBook
On this page

第8课:配置框架:让服务无缝适应各种环境

学习分享 丨作者 / 郑 子 铭 丨公众号 / DotNet NB / CloudNative NB

配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架

配置框架的核心包有两个,一个抽象包,一个实现包

  • Microsoft.Extensions.Configuration.Abstractions

  • Microsoft.Extensions.Configuration

这与依赖注入框架一样,也是使用了接口实现分离的设计模式

配置框架以 Key-value 字符串键值对的方式抽象了配置

同时还支持从各种不同的数据源读取配置,比如从命令行读取,从环境变量读取,从文件中读取

配置框架的核心接口有四个

  • IConfiguration

  • IConfigurationRoot

  • IConfigurationSection

  • IConfigurationBuilder

配置框架有一个核心的扩展点,就是注入自己的配置源,也就是说可以指定任意的配置的数据来源,注入到配置框架里面

  • IConfigurationSource

  • IConfigurationProvider

接下来通过一个基本的控制台应用程序从头到尾演示一个配置的构建和使用

首先引入上面提到的两个包

  • Microsoft.Extensions.Configuration.Abstractions

  • Microsoft.Extensions.Configuration

接着是构建和使用

namespace ConfigurationDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // ConfigurationBuilder 是用来构建配置的核心,所有设置都在 builder 中完成
            IConfigurationBuilder builder = new ConfigurationBuilder();
            // 注入一个内存的配置数据源(注入一个字典集合作为配置数据源)
            builder.AddInMemoryCollection(new Dictionary<string, string>()
            {
                { "key1","value1" },
                { "key2","value2" },
            });
            // Build 方法用来把所有的配置构建出来,并且获得一个 configurationRoot,表示配置的根
            // 也就是说读取配置的动作都需要从 IConfigurationRoot 这个对象读取的
            IConfigurationRoot configurationRoot = builder.Build();
            Console.WriteLine(configurationRoot["key1"]);
            Console.WriteLine(configurationRoot["key2"]);
        }
    }
}

启动程序,输出如下:

value1
value2

IConfigurationSection

namespace ConfigurationDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // ConfigurationBuilder 是用来构建配置的核心,所有设置都在 builder 中完成
            IConfigurationBuilder builder = new ConfigurationBuilder();
            // 注入一个内存的配置数据源(注入一个字典集合作为配置数据源)
            builder.AddInMemoryCollection(new Dictionary<string, string>()
            {
                { "key1","value1" },
                { "key2","value2" },
                { "section1:key4","value4" },
                { "section2:key5","value5" },
                { "section2:key6","value6" },
            });
            // Build 方法用来把所有的配置构建出来,并且获得一个 configurationRoot,表示配置的根
            // 也就是说读取配置的动作都需要从 IConfigurationRoot 这个对象读取的
            IConfigurationRoot configurationRoot = builder.Build();
            //IConfiguration config = configurationRoot;
            Console.WriteLine(configurationRoot["key1"]);
            Console.WriteLine(configurationRoot["key2"]);

            // section 的作用是指当配置不仅仅是简单的 Key value 的时候,比如说需要给配置分组,就可以使用 section 来定义
            // section 每一节是用冒号来作为节的分隔符的
            IConfigurationSection section = configurationRoot.GetSection("section1");
            Console.WriteLine($"key4:{section["key4"]}");
            Console.WriteLine($"key5:{section["key5"]}");
        }
    }
}

启动程序,输出如下:

value1
value2
key4:value4
key5:

section1 的 key5 没有值

打印一下 section2 的 key5

IConfigurationSection section2 = configurationRoot.GetSection("section2");
Console.WriteLine($"key5_v2:{section2["key5"]}");

启动程序,输出如下:

key5_v2:value5

多级嵌套

{ "section2:section3:key7","value7" }

打印输出

var section3 = section2.GetSection("section3");
Console.WriteLine($"key7:{section3["key7"]}");

启动程序,输出如下:

key7:value7
Previous第7课:用Autofac增强容器能力Next第9课:命令行配置提供程序

Last updated 3 years ago

GitHub源码链接:

https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationDemo