五分钟了解dotnetcore配置框架
一、前言
配置的本质就是字符串的键值对,微软的一系列接口其实就是对这些键值对字符串的抽象。
二、基本类型
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配置框架相关推荐
- druid seata 配置_五分钟体验分布式事务框架Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案.本教程 ...
- 五分钟体验分布式事务框架Seata
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单 ...
- 五分钟体验分布式调度框架xxl-job
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速. ...
- 五分钟学会centos配置gitlab
下载gitlab 亲测: centos6.5 安装依赖包: 1: yum install curl policycoreutils policycoreutils-python openssh-ser ...
- 吹牛的资本之Hibernate框架,五分钟搞定Hibernate...
Hibernate框架: (ps:有标记"百度网盘可看"的地方可在网盘中下载配有注释的原代码) 现在努力的敲代码,是为了以后可以选择敲不敲代码! 百度网盘:http://pan.b ...
- STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置
摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...
- linux 查看防火墙状态_每天五分钟学习Linux系列之 - 系统安全配置
20年IT从业,二哥的团队使用最多的系统就是Linux,开发,运维的小伙伴们都离不开Linux系统,特别是大数据和人工智能领域更是如此,但由于日常工作忙,小伙伴们没有太多成块的时间系统的学习Linux ...
- 五分钟搞定 HTTPS 配置,二哥手把手教
01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...
- ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)
ROS探索总结(十三)--导航与定位框架 导航与定位是机器人研究中的重要部分. 一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建 ...
最新文章
- python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题
- 中原大学 php,中原大学php全集视频教程
- kafka的反序列化类KafkaDeserializationSchema的使用(还没整理完)
- Java中的工厂方法模式
- 单片机常用的几种通信协议
- Mutual and feedback(互评与反馈)
- 第一课[编辑器设置-VC++6.0]
- 函数指针及其的运用(上)——何为函数指针
- elasticsearch 学习须知
- jq 获取当时时间的到秒_js(jQuery)获取时间的方法及常用时间类
- 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
- 红米k50 至尊版 解锁bl 获取root教程步骤
- python什么是高阶函数_对于高阶函数的理解是什么?
- 主流搜索引擎分析[特点、功能、市场份额、应用领域]
- 创建不带参数的存储过程
- 实现isPrime()函数,参数是整数,如果整数是质数, 返回True,否则返回False
- 一次ajax多次回调结果,使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享...
- verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波
- 系统分析员考试复习笔记-6:第六章:系统的配置与性能评价
- 笔记1:VC获取系统时间的方法
热门文章
- oracle处理考勤时间,拆分考勤时间段的sql语句
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
- Unity3D学习笔记之六创建更多的Prefab
- 新增功能!Trello个人应用程序登陆 Microsoft Teams
- 每天练习50个shell
- Docker Network 配置,自定义bridge网络
- Java精选笔记_JDBC
- .NET程序加壳的基本原理和方式浅析
- SharePoint 2007 Select People and Groups中搜索不到其他Domain账户的问题[已解决]
- ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】