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", "");
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)
- 命令行中使用--表示配置项,层级关系使用:

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配置框架简介的更多相关文章
- Spring笔记——Spring框架简介和初次框架配置
Spring简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- 《HiWind企业快速开发框架实战》(0)目录及框架简介
<HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...
- Yaf零基础学习总结1-Yaf框架简介
从今天开始,给大家讲解下yaf框架,讲解之前肯定要了解下yaf是个什么东西,当然,从标题我们已经知道yaf是个PHP框架了,也许大家对于PHP框架并不陌生,一般PHP程序员用过的框架至少有一两个吧,国 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
- 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- Rafy 领域实体框架简介
按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...
随机推荐
- Flask 和Django
软件系统发展到今天已经很复杂了,在服务端软件,设计的知识很广泛,为了降低开发难度,提高开发效率,在某些方面去使用别人成熟的框架. 一些事务处理,安全性,数据流控制等都可以让框架处理,而开发人员把更多的 ...
- CSS躬行记(4)——浮动形状
CSS规范新增了一个模块:CSS Shapes,shape-outside属性属于该模块,它能影响浮动元素周边内容流的形状(即浮动形状),可接收三类值:形状盒子.函数和图像. 一.形状盒子 形状盒子( ...
- Hadoop(一)基本简介
是一个由Apache基金会所开发的分布式系统基础架构. 广义上来说,是一个Hadoop生态圈(由一堆框架.软件组成) 版本介绍 分为社区版和商业版 1.x,2.x,-是并行发展的 1.x : 由一个分 ...
- python 网络编程---粘包
一.什么是粘包?(只有在TCP中有粘包现象,在UDP中永远不会粘包) 黏包不一定会发生. 如果发生 了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了. 所谓的粘包问题:主要是是因为 ...
- Java第三十四天,IO操作(续集),非基本对象的读写——序列化流
一.序列化与反序列化 以前在对文件的操作过程当中,读写的对象都是最基本的数据类型,即非引用数据类型.那么如果我们对饮用数据类型(即对象类型)数据进行读写时,应该如何做呢?这就用到了序列化与反序列化. ...
- Linux基础篇,Shell
一.基本知识 Shell Script是一种脚本.可以用来极大的简化计算机的管理.在谱写shell script的时候,需要注意以下问题: 1. 指令的执行是从上而下. 从左而右的分析与执行: 2. ...
- jsjsjs
var TooL = {}; (function(t){ function common(){ console.log("common"); } var a = function( ...
- centos7安装jmeter + ant
1.xshell链接上centos7服务器 先安装jmeter 使用wget jmeter-xxxxxxxxxxxx进行联网自动下载(先进入jmeter官网,然后找到要下载的.tgz压缩包,然后右键 ...
- 如何将一个div水平垂直居中?6种方法做推荐
方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...
- MDC是什么鬼?用法、源码一锅端
近期用到阿里的一款开源的数据同步工具 Canal,不经意之中看到了 MDC 的用法,而且平时项目中也多次用到 MDC,趁机科普一把. 通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a) ...