.Net Core基础之读取配置文件
在应用程序开发中,配置文件是主要存储系统的初始配置信息,配置文件的读取虽然属于基础内容却又经常用到,所以百丈高楼平地起,学习.Net Core,就从学习配置文件开始。在.net framework时代,配置文件主要是xml格式【web.config,app.config】,且每次修改,需要重启,但是在.Net Core中,由于跨平台的关系,配置文件多以json【appsetting.json】的形式存在,且可以进行热加载。本文以一些简单的小例子,简述如何在.Net Core中进行配置文件【Json,xml,ini,环境变量等】的读取,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点
在本例中,主要进行.Net Core开发环境下的配置文件读取,涉及知识点如下:
- IConfiguration:.Net Core中应用程序配置的操作接口,主要提供了对Json,xml,ini ,环境变量,内存数据等的读取功能。
- ConfigurationBuilder:用于构建应用程序配置接口的构建器工具类。
安装插件
在.Net Core中,要实现配置文件的读取,需要依赖以下几个插件包,可以通过Nuget进行安装。具体如下所示:
注意:.Net Core对不同文件的解析,在不同的插件库中,可以根据实际项目需要分别进行安装。此处也体现了面向对象的设计思想【如:开闭原则,单一职责原则】。
读取Json文件
1. 准备数据
首先准备一个Json文件,如下所示:
{"Name": "Alan.hsiang","Age": 20,"Sex": "male","Like": ["basketball","football","swimming"],"Score": {"LandLit": 90,"Mathematics": 99,"English": 50}
}
2. 创建IConfiguration接口实例
在.Net Core中,读取配对文件是通过IConfiguration接口操作的,实例化接口对象如下所示:
IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("student.json").Build();
3. 通过索引器进行读取
默认情况下,IConfiguration接口提供了索引器,以Key为参数进行读取,返回字符串对象,如下所示:
var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字
var like0 = configuration["Like:0"];//读取数组中第一个元素 如:第一个爱好
var like2 = configuration["Like:2"];//读取数组中第三个元素 如:第三个爱好
var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩
注意:如果Json数据有层级关系,则通过冒号【:】进行表示。
4. 通过GetValue<T>()方法进行读取
通过索引器只能返回字符串类型的值,如果需要读取其他简单类型的对象,如:int,float等,则可以通过GetValue<T>()方法进行,具体如下所示:
var age = configuration.GetValue<int>("Age");//获取其他数据类型,如:int,如:年龄
5. 读取数组
通过索引器和泛型方法,可以读取简单类型的对象,如果需要读取复杂对象【如:数组,列表等】,则需要使用绑定,如下所示:
//获取整个数组,如:爱好
var like = new List<string>();
configuration.Bind("Like",like);
6. 整体对象绑定
以上示例都是对Json文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:
首先复制整个Json文件的内容,然后依次点击【编辑-->选择性粘贴-->将JSON粘贴为类】菜单,如下所示:
默认生成的类名为RootObject,然后修改为Student,具体如下所示:
namespace DemoCore
{public class Student{public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }public string[] Like { get; set; }public Score Score { get; set; }}public class Score{public int LandLit { get; set; }public int Mathematics { get; set; }public int English { get; set; }}}
将Student类和配置对象进行绑定,如下所示:
//2. 复杂读取
var student = new Student();
configuration.Bind(student);
Console.WriteLine($"name={student.Name},age={student.Age},like= {string.Join(",", student.Like)},score={student.Score.English}");
7. Json示例截图
读取XML文件
在应用程序开发中,XML文件也是比较常用的一种配置文件。对XML文件的读取操作和Json文件操作基本相似,具体如下所示:
1. 创建XML文件
首先创建一个XML文件,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Student><Name>Alan.hsiang</Name><Age>20</Age><Sex>male</Sex><Likes><Like>basketball</Like><Like>football</Like><Like>swimming</Like></Likes><Score><LandLit>90</LandLit><Mathematics>98</Mathematics><English>60</English></Score>
</Student>
2. 简单读取
通过索引器和GetValue可以进行读取,如下所示:
//1. 基础读取var age = configuration.GetValue<int>("Age");//获取其他数据类型,如:int,如:年龄
var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字
var like0 = configuration["Likes:Like:0"];//读取数组中第一个元素 如:第一个爱好
var like2 = configuration["Likes:Like:2"];//读取数组中第三个元素 如:第三个爱好
var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩
注意:读取数组中的元素时,和json读取不同,因为json中是一个节点,但是在xml中是三个节点。
3. 读取数组
读取XML中的数组列表,如下所示:
//获取整个数组,如:爱好
var like = new List<string>();
configuration.Bind("Likes:Like", like);
Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");
4. 整体绑定对象
以上示例都是对XML文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:
首先复制整个XML文件的内容,然后依次点击【编辑-->选择性粘贴-->将XML粘贴为类】菜单,如下所示:
默认生成的类,类名与XML的根节点保持一致,如下所示:
namespace DemoCore
{// 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。/// <remarks/>[System.SerializableAttribute()][System.ComponentModel.DesignerCategoryAttribute("code")][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)][System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]public partial class Student{private string nameField;private byte ageField;private string sexField;private string[] likesField;private StudentScore scoreField;/// <remarks/>public string Name{get{return this.nameField;}set{this.nameField = value;}}/// <remarks/>public byte Age{get{return this.ageField;}set{this.ageField = value;}}/// <remarks/>public string Sex{get{return this.sexField;}set{this.sexField = value;}}/// <remarks/>[System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)]public string[] Likes{get{return this.likesField;}set{this.likesField = value;}}/// <remarks/>public StudentScore Score{get{return this.scoreField;}set{this.scoreField = value;}}}/// <remarks/>[System.SerializableAttribute()][System.ComponentModel.DesignerCategoryAttribute("code")][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]public partial class StudentScore{private byte landLitField;private byte mathematicsField;private byte englishField;/// <remarks/>public byte LandLit{get{return this.landLitField;}set{this.landLitField = value;}}/// <remarks/>public byte Mathematics{get{return this.mathematicsField;}set{this.mathematicsField = value;}}/// <remarks/>public byte English{get{return this.englishField;}set{this.englishField = value;}}}}
但是默认生成的类,在转换成数组时存在问题,所以需要细微调整,如下所示:
namespace DemoCore
{// 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。/// <remarks/>[System.SerializableAttribute()][System.ComponentModel.DesignerCategoryAttribute("code")][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)][System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]public partial class Student{private string nameField;private byte ageField;private string sexField;private LikesLike likesField;private StudentScore scoreField;/// <remarks/>public string Name{get{return this.nameField;}set{this.nameField = value;}}/// <remarks/>public byte Age{get{return this.ageField;}set{this.ageField = value;}}/// <remarks/>public string Sex{get{return this.sexField;}set{this.sexField = value;}}/// <remarks/>[System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)]public LikesLike Likes{get{return this.likesField;}set{this.likesField = value;}}/// <remarks/>public StudentScore Score{get{return this.scoreField;}set{this.scoreField = value;}}}/// <remarks/>[System.SerializableAttribute()][System.ComponentModel.DesignerCategoryAttribute("code")][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]public partial class StudentScore{private byte landLitField;private byte mathematicsField;private byte englishField;/// <remarks/>public byte LandLit{get{return this.landLitField;}set{this.landLitField = value;}}/// <remarks/>public byte Mathematics{get{return this.mathematicsField;}set{this.mathematicsField = value;}}/// <remarks/>public byte English{get{return this.englishField;}set{this.englishField = value;}}}public partial class LikesLike {public string[] Like { get; set; }}
}
然后在读取时,进行整体绑定,如下所示:
//2. 复杂读取
var student = new Student();
configuration.Bind(student);
Console.WriteLine($"name={student.Name},age={student.Age},like= {string.Join(",", student.Likes.Like)},score={student.Score.English}");
5. 示例截图
注意:通过示例方向,读取XML和读取Json文件,存在细微的差异。
读取INI文件
ini文件在C#程序中,一般应用的不是很多,主要是键值对文件,主要用于存储简单的数据格式,如下所示:
1. 创建ini文件
一般情况下,ini文件包括以下几个部分:a. 注释 用分号做前缀,b. 节点用中括号表示,c. key=value表示内容。如下所示:
;此处表示注释
[student]
Name=Alan.hsiang
Age=20
Grade=4
2. 创建配置并读取
在.Net Core中读取ini文件的步骤,非常简单,如下所示:
private static void ReadIni() {IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddIniFile("student.ini").Build();string name = configuration["student:Name"];//如果没有节点,则直接用key进行获取即可var age = configuration.GetValue<int>("student:Age");var grade = configuration.GetValue<int>("student:Grade");Console.WriteLine($"name={name},age={age},grade= {string.Join(",", grade)}");}
注意:由于ini文件不涉及复杂的数据结构,所以直接通过索引器和GetValue即可。
3. 示例截图
读取ini文件的示例截图如下所示:
读取环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。
1. 查看环境变量
在win10操作系统中,此电脑-->右键-->属性-->高级系统设置-->环境变量-->然后打开环境变量对话框。如下所示:
环境变量分为用户变量【当前用户】,和系统变量【全部用户】,如下所示:
2. 简单读取
在.NetCore中读取环境变量的值,如下所示:
private static void ReadEnvironmentVariable() {IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddEnvironmentVariables().Build();var path = configuration["Path"];var temp = configuration["TEMP"];var os = configuration["OS"];var arr = path.Split(";");Console.WriteLine("path:");foreach (var a in arr){Console.WriteLine(a);}Console.WriteLine($"temp={temp}\n os= {os}");
}
3. 示例截图
读取环境变量示例截图如下所示:
备注
以上是在.Net Core中读取几种常见数据的方式,旨在抛砖引玉,共同学习,一起进步。
千秋岁·数声鶗鴂【作者】张先 【朝代】宋
数声鶗鴂。又报芳菲歇。惜春更把残红折。雨轻风色暴,梅子青时节。永丰柳,无人尽日飞花雪。
莫把幺弦拨。怨极弦能说。天不老,情难绝。心似双丝网,中有千千结。夜过也,东窗未白凝残月。
.Net Core基础之读取配置文件相关推荐
- ASP.NET Core实现类库项目读取配置文件
前言 之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇博客的出现, ...
- asp.net core轻松入门之MVC中Options读取配置文件
接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...
- .NET Core 6.0之读取配置文件
在ASP.NET Core 6.0中,默认配置文件是appsettings.json,该文件存储的内容为JSON格式的字符串,我们一般都将程序的配置放在这个文件里面,提供给程序使用,那么我们该如何操作 ...
- .net core读取配置文件
为什么80%的码农都做不了架构师?>>> 1.读取配置文件 首选随便定义一个实体类,比如这样的: public class WebConfig { pu ...
- .Net Core下如何管理配置文件
一.前言 根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XX ...
- c++读取txt文件中的数字_SpringBoot 多种读取配置文件中参数的方式
点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:http://www.mydlq.club/article/61/ . 一.简介 . 1.SpringBoot ...
- 基于Golang的监听读取配置文件的程序包开发——simpleConfig_v1
基于Golang的监听&读取配置文件的程序包开发--simpleConfig_v1 [阅读时间:约10分钟] 一.配置文件概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- SpringBoot 读取配置文件中参数全面教程
一.简介 在日常开发使用 SpringBoot 框架时,经常有一些配置信息需要放置到配置文件中,我们需要手动读取这些配置到应用中进行一些逻辑,这里整理了一些常用读取配置的方法,简单介绍一下. 1.Sp ...
最新文章
- 【组队学习】【34期】阿里云天池在线编程训练营
- 鄂维南院士:科学与智能——机器学习的新前沿、应用数学时代的曙光
- flowable 任务节点多实例使用
- php是否支持64位,phpstudy默认不支持64位php的解决方法
- 金立旗下18辆车产被司法拍卖 成交额近500万元
- Buildroot根文件系统构建
- mysql text字段导出_用命令创建MySQL数据库
- js中contains()方法的了解
- Java语言速览:StackOverflow
- 坦克大战之声音处理类(四)
- C语言利用指针实现字符串逆序输出
- 什么是自动化与自主化?
- Python的运行加速:C究竟比python快在哪
- apm系统服务器,apm系统
- 1553B为什么要加耦合器?
- 图形学-着色(Blinn-Phong模型)
- 什么是TLC颗粒?与MLC、SLC区别
- 音乐计算机编程,计算机音乐编程的基本类型研究
- 音频左右声道数据合并到一个声道
- 数据库应用——MySQL集群