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


    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
    

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    python socket练习
    python异常处理
    python类的反射
    类的特殊成员方法
    staticmethod classmethod property方法
    类的多态
    类的析构、继承
    python subprocess模块
    python面向对象
    discuz 使模板中的函数不解析 正常使用
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/12359663.html
Copyright © 2020-2023  润新知