.net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》
在我们之前.Net Framework的项目中,配置文件是WebConfig或AppcConfig文件,而当我们想要添加我们自定义的节点时,还需要在这个文件中的section中定义我们自定义的节点,这样的配置文件中的系统配置和我们自定义的配置耦合度也很高。
而在.Net Core中,配置系统改变了,它支持多种数据源,让配置文件变的不再单一化:json,xml,ini,memory,command, env
以下项目都是以控制台项目为基础
一、Json
1、要想加载json文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Json
2、我们在项目中新增一个 appSettings.json 文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入json文件中的结果
二、Xml
1、要想加载xml文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Xml
2、我们在项目中新增一个 appSettings.xml 文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddXmlFile("appSettings.xml")
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入xml文件中的结果
三、Ini
1、要想加载ini文件中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.Ini
2、我们在项目中新增一个 appSettings.ini文件,并且设置始终复制到输出目录
3、接下来我们看以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddIniFile("appSettings.ini")
.Build();
var info = configuration["[user] username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后我们可以看到控制台上输入ini文件中的结果
四、Memory
1、要想加载MemoryCollection中的数据,就必须要安装它所依赖的包,我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration 由于以上数据源安装的时候的包都依赖于它,所有这里不需要安装
2、接下来看代码:
static void Main(string[] args)
{
List<KeyValuePair<string, string>> initialData = new List<KeyValuePair<string, string>>();
initialData.Add(new KeyValuePair<string, string>("username", "tom")); IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddInMemoryCollection(initialData)
.Build();
var info = configuration["username"];
Console.WriteLine(info);
Console.ReadKey();
}
最后得出结果tom
五、CommandLine
目录还没用过,待研究
六、EnviromentVariables
这个是从环境变量中获取值
1、我们打开NuGet包管理器,搜索并安装 Microsoft.Extensions.Configuration.EnvironmentVariables
2、打开你的电脑,右键属性,选择高级,选择环境变量,随便复制一个环境变量名
3、然后将你复制的变量名作为你要获取该环境变量值的Key
4、以下代码:
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddEnvironmentVariables()
.Build();
var info = configuration["ASPNETCORE_ENVIRONMENT"];
Console.WriteLine(info);
Console.ReadKey();
}
以AddJsonFile这个方法为例,我们可以看出,这个方法有多个重载:
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path);
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional); public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange);
optional这个参数表示这个文件是否是可选的,reloadOnChange这个表示文件改变时,是否重新加载这个文件(热加载)
reloadOnChange=true时,项目在运行,获取到username这个值为tom,当我们从json文件中改变username的值为lucy时,项目读取它的值也会立马发生改变 七、弱类型读取 以上获取json文件中的数据都是一维的,那么二维,三维,多维的时候我们该怎么获取呢?
接下来我们调试下,看看最终得到的IConfiguration里面是什么样子的,我在json文件中写了一个person数组
1、用:运算符的方式获取想要的数据

我们可以看出,数据是Key,Value类型的,是不是只要我们根据前面的key就可以获取后面的 Value呢?
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration["person:0:name"];
Console.WriteLine(info);
Console.ReadKey();
}
结果:
2、使用GetSection ()方法进行获取
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration.GetSection("person").GetSection("").GetSection("name").Value;
var info1 = configuration.GetSection("person").GetSection("")["name"];
Console.WriteLine(info);
Console.WriteLine(info1);
Console.ReadKey();
}
结果如下:

八、强类型读取
安装 Microsoft.Extensions.Configuration.Binder 包
1、GetValue<T>
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
var info = configuration.GetValue<string>("username");
Console.WriteLine(info);
Console.ReadKey();
}
}
结果如下:

2、Bind()
public class Rootobject
{
public string username { get; set; }
public Person[] person { get; set; }
}
public class Person
{
public string id { get; set; }
public string name { get; set; }
}
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
Rootobject rootobject = new Rootobject();
configuration.Bind(rootobject);
Console.WriteLine(rootobject.username);
Console.ReadKey();
}
结果如下:

3、Get<T>()
static void Main(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appSettings.json")
.Build();
Rootobject rootobject=configuration.Get<Rootobject>();
Console.WriteLine(rootobject.username);
Console.ReadKey();
}
结果如下:

那么Bind()和Get<T>()有什么区别呢?
通过源码分析这两个方法,主要区别在于,Get<T>()方法主要用到了反射,通过反射创建T的一个对象返回
.net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》的更多相关文章
- .net core系列之《.net core内置IOC容器ServiceCollection》
一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...
- Asp.Net Core 内置IOC容器的理解
Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- NET Core 3.0 AutoFac替换内置DI的新姿势
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
- 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...
- 简单讲解Asp.Net Core自带IOC容器ServiceCollection
一. 理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二. 接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...
- .net core 2.0学习记录(三):内置IOC与DI的使用
本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...
随机推荐
- oracle创建表空间个用户四部曲
/*分为四步 *//*第1步:创建临时表空间 */create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9 ...
- java容器类1:Collection,List,ArrayList,LinkedList深入解读
1. Iterable 与 Iterator Iterable 是个接口,实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符 ...
- C# 委托的一些使用上的小技巧
1.委托是一种数据类型,我们可以在任何定义类的地方定义委托,在任何声明类的地方声明委托 2.初始化委托有两种方式,代码如下: (1).像类一样初始化委托 public delegate void Sa ...
- UBUNTU 无法解析域名 解决方法
莫名其妙的,ubuntu 无法访问外网. ping www.taobao.com www.baidu.com 提示无效的主机名 但是ping 外网ip 都是可以PING通的. 所以断定是 dns问题 ...
- pycharm使用github
pycharm使用github 绑定账号 File-settings 在搜索框输入git 会出现github,然后在旁边输入你github的用户名和密码,可以点击”test”测试一下,如果出现: Co ...
- 时间格式为yyyymmdd的String类型的时间,计算时间间隔有错误
时间格式类型为yyyymmdd,并且为String类型,计算时间间隔有误,一直搞不清楚是什么原因.网上百度了许多,时间格式基本都是yyyy-mm-dd这样的时间格式的,但是yyyymmdd这样的时间格 ...
- 阿里云CentOS7.4上搭建FTP服务器
1 安装过程 第一步:首先判断是否安装了vsftpd # rpm -qa | grep vsftpd 第二步:如果没有安装则安装vsftpd # yum -y install vsftpd 从第三步开 ...
- JavaScript设计模式-18.享元模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Ibatis框架之系统架构
如果用最简洁的话来总结 iBATIS 主要完成那些功能时,我想下面几个代码足够概括. Class.forName("oracle.jdbc.driver.OracleDriver" ...
- PTA (Advanced Level) 1010 Radix
Radix Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? ...