一、前言

配置的本质就是字符串的键值对,微软的一系列接口其实就是对这些键值对字符串的抽象。

二、基本类型

2.1、Nuget包

  • Microsoft.Extensions.Configuration.Abstractions

  • Microsoft.Extensions.Configuration

2.2、抽象接口

  • IConfiguration

    • 提供了查询、设置配置项、监控变化等方法

  • IConfigurationRoot

    • 在IConfiguration接口基础上,增加了 Reload 方法强制从provider中重新加载配置值

  • IConfigurationSection

    • 对配置节点的抽象

  • IConfigurationBuilder

    • 根据提供的数据源注册并构建IConfiguration

  • IConfigurationSource

    • 对数据源的抽象,例如Json、xml、环境变量、内存变量等

  • IConfigurationProvider

    • 规定了配置项的获取、设置、重载等统一的行为

三、基本配置

注:各种配置方式的目的是在控制台中输出以下内容,如下图:

3.1、加载内存中的配置

  • 需要引入包:Microsoft.Extensions.Configuration

  • 主要方法:builder.AddInMemoryCollection()

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();var memoryData = new Dictionary<string, string>();memoryData.Add("Student:Code", "10002385");memoryData.Add("Student:Name", "LiuSan");builder.AddInMemoryCollection(memoryData);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");        Console.Read();
}

3.2、加载环境变量中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.EnvironmentVariables

  • 主要方法:builder.AddEnvironmentVariables()

  • 环境变量中层级关系使用 __ 代替 :

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddEnvironmentVariables();IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.3、加载命令行中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.CommandLine

  • 主要方法:builder.AddCommandLine(args)

  • 命令行中使用--表示配置项,层级关系使用:

  • 主要在docker中使用

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddCommandLine(args);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.4、加载Json中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Json

  • 主要方法:builder.AddJsonFile("appsettings.json")

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.5、加载xml中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Xml

  • 主要方法:builder.AddXmlFile("appsettings.xml")

  • xml中不会读取最外层,所以Section必需从第二层开始

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddXmlFile("appsettings.xml");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

四、高级配置

4.1、将配置绑定至强对象

  • 需要引入包:Microsoft.Extensions.Configuration.Binder

  • 主要方法:configurationRoot.GetSection("Student").Bind(student)

  class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();var student = new Student();configurationRoot.GetSection("Student").Bind(student);Console.WriteLine($"Code:{student.Code}");Console.WriteLine($"Name:{student.Name}");Console.Read();}}class Student{public string Code { get; set; }public string Name { get; set; }}

4.2、IOptions

  • 需要引入包:Microsoft.Extensins.Options

  • 需要引入包:Microsoft.Extensions.Options.ConfigurationExtensions

  • 本质其实就是将一个Section配置节点映射到一个实体对象

    class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IServiceCollection services = new ServiceCollection();services.Configure<WeixinOptions>(configurationRoot.GetSection("WeixinSetting"));services.AddScoped<IWeixinService, WeixinService>();var provider = services.BuildServiceProvider();var weixinService = provider.GetService<IWeixinService>();string appId = weixinService.AppId;string token = weixinService.Token;Console.Read();}}interface IWeixinService{string AppId { get; }string Token { get; }}class WeixinService: IWeixinService{IOptions<WeixinOptions> _options;public WeixinService(IOptions<WeixinOptions> options){_options = options;}public string AppId { get => _options.Value.AppId; }public string Token { get => _options.Value.Token;}}class WeixinOptions{public string AppId { get; set; }public string Token { get; set; }}

4.3、热更新

  • IConfigurationBuilder添加数据源时设置reloadOnChange=true

  • 监听的核心方法:var token = configurationRoot.GetReloadToken();

 static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");var token = configurationRoot.GetReloadToken();ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () => {Console.WriteLine("配置发生改变了...");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");});           Console.Read();}

五、总结

  • 配置就是key-value键值对字符串

  • IConfiguration和IConfigurationRoot是对键值对的抽象

  • IConfigurationBuilder用于构建IConfiguration和IConfigurationRoot

  • IConfigurationSource是对数据源的抽象

  • IConfigurationProvider将不同来源的IConfigurationSource 转为统一的模型

  • IOptions方便将不同的配置节点(Path)映射为对应的强类型对象

  • IConfigurationBuilder添加多个数据源(IConfigurationSource)后,如果key重名,则以最后一个配置为准(覆盖前面)

五分钟了解dotnetcore配置框架相关推荐

  1. druid seata 配置_五分钟体验分布式事务框架Seata

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案.本教程 ...

  2. 五分钟体验分布式事务框架Seata

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单 ...

  3. 五分钟体验分布式调度框架xxl-job

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速. ...

  4. 五分钟学会centos配置gitlab

    下载gitlab 亲测: centos6.5 安装依赖包: 1: yum install curl policycoreutils policycoreutils-python openssh-ser ...

  5. 吹牛的资本之Hibernate框架,五分钟搞定Hibernate...

    Hibernate框架: (ps:有标记"百度网盘可看"的地方可在网盘中下载配有注释的原代码) 现在努力的敲代码,是为了以后可以选择敲不敲代码! 百度网盘:http://pan.b ...

  6. STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

    摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...

  7. linux 查看防火墙状态_每天五分钟学习Linux系列之 - 系统安全配置

    20年IT从业,二哥的团队使用最多的系统就是Linux,开发,运维的小伙伴们都离不开Linux系统,特别是大数据和人工智能领域更是如此,但由于日常工作忙,小伙伴们没有太多成块的时间系统的学习Linux ...

  8. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

  9. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)

    ROS探索总结(十三)--导航与定位框架 导航与定位是机器人研究中的重要部分.         一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建 ...

最新文章

  1. python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题
  2. 中原大学 php,中原大学php全集视频教程
  3. kafka的反序列化类KafkaDeserializationSchema的使用(还没整理完)
  4. Java中的工厂方法模式
  5. 单片机常用的几种通信协议
  6. Mutual and feedback(互评与反馈)
  7. 第一课[编辑器设置-VC++6.0]
  8. 函数指针及其的运用(上)——何为函数指针
  9. elasticsearch 学习须知
  10. jq 获取当时时间的到秒_js(jQuery)获取时间的方法及常用时间类
  11. 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
  12. 红米k50 至尊版 解锁bl 获取root教程步骤
  13. python什么是高阶函数_对于高阶函数的理解是什么?
  14. 主流搜索引擎分析[特点、功能、市场份额、应用领域]
  15. 创建不带参数的存储过程
  16. 实现isPrime()函数,参数是整数,如果整数是质数, 返回True,否则返回False
  17. 一次ajax多次回调结果,使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享...
  18. verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波
  19. 系统分析员考试复习笔记-6:第六章:系统的配置与性能评价
  20. 笔记1:VC获取系统时间的方法

热门文章

  1. oracle处理考勤时间,拆分考勤时间段的sql语句
  2. C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
  3. Unity3D学习笔记之六创建更多的Prefab
  4. 新增功能!Trello个人应用程序登陆 Microsoft Teams
  5. 每天练习50个shell
  6. Docker Network 配置,自定义bridge网络
  7. Java精选笔记_JDBC
  8. .NET程序加壳的基本原理和方式浅析
  9. SharePoint 2007 Select People and Groups中搜索不到其他Domain账户的问题[已解决]
  10. ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】