前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

.NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

作者头像
郑子铭
发布2021-01-13 15:22:20
3360
发布2021-01-13 15:22:20
举报

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

接着是构建和使用

代码语言:javascript
复制
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"]);
        }
    }
}

启动程序,输出如下:

代码语言:javascript
复制
value1
value2

IConfigurationSection

代码语言:javascript
复制
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"]}");
        }
    }
}

启动程序,输出如下:

代码语言:javascript
复制
value1
value2
key4:value4
key5:

section1 的 key5 没有值

打印一下 section2 的 key5

代码语言:javascript
复制
IConfigurationSection section2 = configurationRoot.GetSection("section2");
Console.WriteLine($"key5_v2:{section2["key5"]}");

启动程序,输出如下:

代码语言:javascript
复制
key5_v2:value5

多级嵌套

代码语言:javascript
复制
{ "section2:section3:key7","value7" }

打印输出

代码语言:javascript
复制
var section3 = section2.GetSection("section3");
Console.WriteLine($"key7:{section3["key7"]}");

启动程序,输出如下:

代码语言:javascript
复制
key7:value7

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 08 | 配置框架:让服务无缝适应各种环境
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档