一、前言

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

二、基本类型

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配置框架简介的更多相关文章

  1. Spring笔记——Spring框架简介和初次框架配置

    Spring简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

  2. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  3. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  4. Yaf零基础学习总结1-Yaf框架简介

    从今天开始,给大家讲解下yaf框架,讲解之前肯定要了解下yaf是个什么东西,当然,从标题我们已经知道yaf是个PHP框架了,也许大家对于PHP框架并不陌生,一般PHP程序员用过的框架至少有一两个吧,国 ...

  5. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

  6. 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

    3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...

  7. 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  8. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  9. Rafy 领域实体框架简介

    按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...

随机推荐

  1. Light of future-冲刺Day 3

    目录 1.SCRUM部分: 每个成员进度 SCRUM 会议的照片 签入记录 代码运行截图 发布界面 用户浏览界面 管理员浏览界面 2.PM 报告: 时间表 燃尽图 任务总量变化曲线 每名成员的贡献比 ...

  2. Spring Taco Cloud——配料表(Lombok的安装及其注解)

    先简单概括下这个项目:外卖订餐平台Web,这个是承接我的这篇博文来续写的https://www.cnblogs.com/yycjavastudy/articles/12666104.html,在这一篇 ...

  3. docker下安装centos,并在其上搭建lnmp环境

    一.安装CentOs容器 1.进入docker下载CentOs,这里我使用的CentOs6.8 docker pull centos:6.8 2.创建容器 sudo docker run --priv ...

  4. node.js代码

    // 1. 引入 express var express = require('express'); var formidable = require('formidable'); var mysql ...

  5. 让 .NET 轻松构建中间件模式代码

    让 .NET 轻松构建中间件模式代码 Intro 在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢. 于是就有了封装了一个简单通用的中间件模板的想法, ...

  6. 彻底理解Java对象与引用

    本文是最近在复习Java的时候读到的来自iteye博客的一篇文章,个人觉得写的很好,但貌似楼主许久没有维护该博客,害怕将来想回顾的时候找不到此文章,故在此重写文章,并修改了一些排版,有助于以后的学习查 ...

  7. mysql yum源安装

    部署服务器环境的时候经常要安装mysql,以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装. yum源下载 进入 https://dev.mysql.com/dow ...

  8. Python爬虫系列(六):搜索文档树

    今天早上,写的东西掉了.这个烂知乎,有bug,说了自动保存草稿,其实并没有保存.无语 今晚,我们将继续讨论如何分析html文档. 1.字符串 #直接找元素soup.find_all('b') 2.正则 ...

  9. PyCharm 项目打开窗口设置为当前还是新开一个怎么办?

     前言:       我找这个设置找了好久,后来在一篇博文中才找到,现在记录下来一下,顺便带图解释一下   设置步骤: File -> Setting -> Appearance & ...

  10. JAVA开发中相对路径,绝对路径全面总结

    JAVA开发中相对路径,绝对路径全面总结 博客分类: Java综合 JavaJSP应用服务器Servlet网络应用 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径, ...