8:配置框架:让服务无缝适应各种环境-.NET Core开发实战
.NET Core开发实战前文传送门:
- 第1课:课程介绍
- 第2课:内容综述
- 第3课:.NET Core的现状、未来以及环境搭建
- 第4课:Startup:掌握ASP.NET Core的启动过程
- 第5课:依赖注入:良好架构的起点(上)
- 第5课:依赖注入:良好架构的起点(中)
- 第5课:依赖注入:良好架构的起点(下)
- 第6课:作用域与对象释放行为(上)
- 第6课:作用域与对象释放行为(下)
- 第7课:用Autofac增强容器能力(上)
- 第7课:用Autofac增强容器能力(下)
08 | 配置框架:让服务无缝适应各种环境
配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架
配置框架的核心包有两个,一个抽象包,一个实现包
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Configuration
这与依赖注入框架一样,也是使用了接口实现分离的设计模式
配置框架以 Key-value 字符串键值对的方式抽象了配置
同时还支持从各种不同的数据源读取配置,比如从命令行读取,从环境变量读取,从文件中读取
配置框架的核心接口有四个
- IConfiguration
- IConfigurationRoot
- IConfigurationSection
- IConfigurationBuilder
配置框架有一个核心的扩展点,就是注入自己的配置源,也就是说可以指定任意的配置的数据来源,注入到配置框架里面
- IConfigurationSource
- IConfigurationProvider
接下来通过一个基本的控制台应用程序从头到尾演示一个配置的构建和使用
源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/ConfigurationDemo
首先引入上面提到的两个包
- 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

原文出处:微信公众号【DotNet NB】,作者【郑子铭】
原文链接:https://mp.weixin.qq.com/s/IfmCUOJbcF7qyXUM9DrzVQ
本文观点不代表Dotnet9立场,转载请联系原作者。