.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之后是通过在运行的时候根据配置来实 ...
随机推荐
- window.name实现跨域
在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 这篇文章中,我提到了几种跨域的方式,这里主要讲解使用window.name实现跨域. 跨域就 ...
- 通过System获取java环境变量的路径
通过System获取java环境变量的路径代码为: import java.io.FileNotFoundException; import java.io.FileOutputStream; imp ...
- Android进程管理
1.进程按照优先级分为不同的等级FVSBE Foreground process前台进程:用户可看到进程里某个activity界面(可以获得焦点的) Visible process可见进程:用户仍可见 ...
- python-fifo管道文件通信
#!/usr/bin/python #coding=utf-8 import os,sys,multiprocessing,time try: os.mkfifo('file') except :pa ...
- xml布局中include的使用
参考:http://blog.csdn.net/harvic880925/article/details/17263275 include_button1.xml <?xml version=& ...
- 【angular5项目积累总结】panel组件
view code panel.component.css :host { display:flex; min-width:300px } panel.component.html <heade ...
- Spring----有关bean的配置
1.单例类的配置如果我们想创建一个单例类的bean,只能会通过静态工厂来创建.下图为一个单例类: Stage并没有提供公开的构造方法,构造方法都是私有的,必须通过getInstance()方法获得已经 ...
- MyBatis中插入并返回主键
开发过程中经常遇到需要插入一条数据,并且返回这条数据自增的主键,在MyBatis中只需要在mapper中添加keyProperty属性即可 在mapper中添加keyProperty属性 <in ...
- Swift函数_默认参数
swift中提供了默认参数功能,在声明函数时给参数指定默认值. 例: func inputStudentInfo(name:String,age:Int="26") { print ...
- java 基础 --- 动态代理和静态代理
问题 : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...