.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之后是通过在运行的时候根据配置来实 ...
随机推荐
- java 并发编程——Thread 源码重新学习
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- flot中文详解
调用plot函数的方法如下: var plot = $.plot(placeholder, data, options) Data的结构: data应该是data series的一个数组: [ ser ...
- JDBC处理可滚动的处理集
Statement createStatement(int resultSetType, int resultSetConcurrency, ...
- python-TCP传输模型
#!/usr/bin/python #coding=utf-8 #服务器端 from socket import * from time import ctime HOST="192.168 ...
- Spring mvc解析
方案时间 ,写代码时间 ,解决技术难点时间 , 自测时间,解决bug时间 , 联调时间 ,数据库优化,代码走查1个接口:2个小时 把那个字段再复原回来,不然兼容性不强还有一个刷数据的接口 public ...
- 常用 JavaScript 小技巧及原理详解
善于利用JS中的小知识的利用,可以很简洁的编写代码 1. 使用!!模拟Boolean()函数 原理:逻辑非操作一个数据对象时,会先将数据对象转换为布尔值,然后取反,两个!!重复取反,就实现了转换为布尔 ...
- [转]Porting to Oracle with Entity Framework NLog
本文转自:http://izzydev.net/.net/oracle/entityframework/2017/02/01/Porting-to-Oracle-with-Entity-Framewo ...
- MyEclipse部署web项目的关键
我自己的经验: 主要有3点: 自己的代码要正确 数据库服务确保已经启动 确保你的访问路径是正确的 1.自己的代码要正确 比如jdbc驱动,正确的写法:private static final Stri ...
- [转]C# 6.0 的新特性
本文的内容包括引入C#6.0中的新的语言特性有哪些. 还有已经被引入的代码名称为 “Roslyn”新编译器. 编译器是开放源码的,并且可以从 codeplex 网站的这个地址下载到源代码: https ...
- SQL Server将DataTable传入存储过程(Table Value Parameter)
博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 SQL Server 数据库是不支持数组类型变量的,想要实现数组的功能,可以通过 XML 和数据表的方法实现,但是实现方法非常 ...