.NetCore基礎(chǔ)之讀取配置文件詳解
在應(yīng)用程序開發(fā)中,配置文件是主要存儲系統(tǒng)的初始配置信息,配置文件的讀取雖然屬于基礎(chǔ)內(nèi)容卻又經(jīng)常用到,所以百丈高樓平地起,學(xué)習(xí).Net Core,就從學(xué)習(xí)配置文件開始。在.net framework時代,配置文件主要是xml格式【web.config,app.config】,且每次修改,需要重啟,但是在.Net Core中,由于跨平臺的關(guān)系,配置文件多以json【appsetting.json】的形式存在,且可以進(jìn)行熱加載。本文以一些簡單的小例子,簡述如何在.Net Core中進(jìn)行配置文件【Json,xml,ini,環(huán)境變量等】的讀取,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。
涉及知識點
在本例中,主要進(jìn)行.Net Core開發(fā)環(huán)境下的配置文件讀取,涉及知識點如下:
IConfiguration:.Net Core中應(yīng)用程序配置的操作接口,主要提供了對Json,xml,ini ,環(huán)境變量,內(nèi)存數(shù)據(jù)等的讀取功能。
ConfigurationBuilder:用于構(gòu)建應(yīng)用程序配置接口的構(gòu)建器工具類。
安裝插件
在.Net Core中,要實現(xiàn)配置文件的讀取,需要依賴以下幾個插件包,可以通過Nuget進(jìn)行安裝。具體如下所示:
注意:.Net Core對不同文件的解析,在不同的插件庫中,可以根據(jù)實際項目需要分別進(jìn)行安裝。此處也體現(xiàn)了面向?qū)ο蟮脑O(shè)計思想【如:開閉原則,單一職責(zé)原則】。
讀取Json文件
1. 準(zhǔn)備數(shù)據(jù)
首先準(zhǔn)備一個Json文件,如下所示:
{ "Name": "Alan.hsiang", "Age": 20, "Sex": "male", "Like": ["basketball","football","swimming"], "Score": { "LandLit": 90, "Mathematics": 99, "English": 50 } }
2. 創(chuàng)建IConfiguration接口實例
在.Net Core中,讀取配對文件是通過IConfiguration接口操作的,實例化接口對象如下所示:
IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("student.json").Build();
3. 通過索引器進(jìn)行讀取
默認(rèn)情況下,IConfiguration接口提供了索引器,以Key為參數(shù)進(jìn)行讀取,返回字符串對象,如下所示:
var name = configuration["Name"]; //IConfiguration接口自帶的索引器,只返回字符串類型。如:名字 var like0 = configuration["Like:0"];//讀取數(shù)組中第一個元素 如:第一個愛好 var like2 = configuration["Like:2"];//讀取數(shù)組中第三個元素 如:第三個愛好 var landLit = configuration["Score:LandLit"];//獲取字節(jié)點的屬性值,如:語文成績
注意:如果Json數(shù)據(jù)有層級關(guān)系,則通過冒號【:】進(jìn)行表示。
4. 通過GetValue<T>()方法進(jìn)行讀取
通過索引器只能返回字符串類型的值,如果需要讀取其他簡單類型的對象,如:int,float等,則可以通過GetValue<T>()方法進(jìn)行,具體如下所示:
var age = configuration.GetValue<int>("Age");//獲取其他數(shù)據(jù)類型,如:int,如:年齡
5. 讀取數(shù)組
通過索引器和泛型方法,可以讀取簡單類型的對象,如果需要讀取復(fù)雜對象【如:數(shù)組,列表等】,則需要使用綁定,如下所示:
//獲取整個數(shù)組,如:愛好 var like = new List<string>(); configuration.Bind("Like",like);
6. 整體對象綁定
以上示例都是對Json文件局部數(shù)據(jù)的讀取,那么可以將整個文件轉(zhuǎn)換為對象嗎?這樣直接操作對象將對很方便快捷。具體如下所示:
首先復(fù)制整個Json文件的內(nèi)容,然后依次點擊【編輯-->選擇性粘貼-->將JSON粘貼為類】菜單,如下所示:
默認(rèn)生成的類名為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類和配置對象進(jìn)行綁定,如下所示:
//2. 復(fù)雜讀取 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文件
在應(yīng)用程序開發(fā)中,XML文件也是比較常用的一種配置文件。對XML文件的讀取操作和Json文件操作基本相似,具體如下所示:
1. 創(chuàng)建XML文件
首先創(chuàng)建一個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可以進(jìn)行讀取,如下所示:
//1. 基礎(chǔ)讀取 var age = configuration.GetValue<int>("Age");//獲取其他數(shù)據(jù)類型,如:int,如:年齡 var name = configuration["Name"]; //IConfiguration接口自帶的索引器,只返回字符串類型。如:名字 var like0 = configuration["Likes:Like:0"];//讀取數(shù)組中第一個元素 如:第一個愛好 var like2 = configuration["Likes:Like:2"];//讀取數(shù)組中第三個元素 如:第三個愛好 var landLit = configuration["Score:LandLit"];//獲取字節(jié)點的屬性值,如:語文成績
注意:讀取數(shù)組中的元素時,和json讀取不同,因為json中是一個節(jié)點,但是在xml中是三個節(jié)點。
3. 讀取數(shù)組
讀取XML中的數(shù)組列表,如下所示:
//獲取整個數(shù)組,如:愛好 var like = new List<string>(); configuration.Bind("Likes:Like", like); Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");
4. 整體綁定對象
以上示例都是對XML文件局部數(shù)據(jù)的讀取,那么可以將整個文件轉(zhuǎn)換為對象嗎?這樣直接操作對象將對很方便快捷。具體如下所示:
首先復(fù)制整個XML文件的內(nèi)容,然后依次點擊【編輯-->選擇性粘貼-->將XML粘貼為類】菜單,如下所示:
默認(rèn)生成的類,類名與XML的根節(jié)點保持一致,如下所示:
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; } } } }
但是默認(rèn)生成的類,在轉(zhuǎn)換成數(shù)組時存在問題,所以需要細(xì)微調(diào)整,如下所示:
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; } } }
然后在讀取時,進(jìn)行整體綁定,如下所示:
//2. 復(fù)雜讀取 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文件,存在細(xì)微的差異。
讀取INI文件
ini文件在C#程序中,一般應(yīng)用的不是很多,主要是鍵值對文件,主要用于存儲簡單的數(shù)據(jù)格式,如下所示:
1. 創(chuàng)建ini文件
一般情況下,ini文件包括以下幾個部分:a. 注釋 用分號做前綴,b. 節(jié)點用中括號表示,c. key=value表示內(nèi)容。如下所示:
;此處表示注釋 [student] Name=Alan.hsiang Age=20 Grade=4
2. 創(chuàng)建配置并讀取
在.Net Core中讀取ini文件的步驟,非常簡單,如下所示:
private static void ReadIni() { IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddIniFile("student.ini").Build(); string name = configuration["student:Name"];//如果沒有節(jié)點,則直接用key進(jìn)行獲取即可 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文件不涉及復(fù)雜的數(shù)據(jù)結(jié)構(gòu),所以直接通過索引器和GetValue即可。
3. 示例截圖
讀取ini文件的示例截圖如下所示:
讀取環(huán)境變量
環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運行環(huán)境的一些參數(shù),如:臨時文件夾位置和系統(tǒng)文件夾位置等。環(huán)境變量相當(dāng)于給系統(tǒng)或用戶應(yīng)用程序設(shè)置的一些參數(shù),具體起什么作用這當(dāng)然和具體的環(huán)境變量相關(guān)。
1. 查看環(huán)境變量
在win10操作系統(tǒng)中,此電腦-->右鍵-->屬性-->高級系統(tǒng)設(shè)置-->環(huán)境變量-->然后打開環(huán)境變量對話框。如下所示:
環(huán)境變量分為用戶變量【當(dāng)前用戶】,和系統(tǒng)變量【全部用戶】,如下所示:
2. 簡單讀取
在.NetCore中讀取環(huán)境變量的值,如下所示:
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. 示例截圖
讀取環(huán)境變量示例截圖如下所示:
備注
以上是在.Net Core中讀取幾種常見數(shù)據(jù)的方式
到此這篇關(guān)于.NetCore基礎(chǔ)之讀取配置文件詳解的文章就介紹到這了,更多相關(guān).Net Core 讀取配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net 無法獲取的內(nèi)部內(nèi)容,因為該內(nèi)容不是文本 的解決方法
asp.net 無法獲取的內(nèi)部內(nèi)容,因為該內(nèi)容不是文本 的解決方法2009-12-12.NET實現(xiàn)Repeater控件+AspNetPager控件分頁
本文給大家分享的2個示例,演示AspNetPager最基本的功能,幫助您認(rèn)識AspNetPager分頁控件及了解它的工作原理。有需要的小伙伴可以參考下2015-11-11.Net語言Smobiler開發(fā)之如何在手機(jī)上實現(xiàn)表單設(shè)計
這篇文章主要為大家詳細(xì)介紹了.Net語言APP開發(fā)平臺,如何在手機(jī)上實現(xiàn)表單設(shè)計(Smobiler),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09ASP.NET網(wǎng)站模板的實現(xiàn)(第2節(jié))
這篇文章主要為大家詳細(xì)介紹了如何實現(xiàn)網(wǎng)站模板,了解母版頁在整合頁面公共元素、統(tǒng)一頁面風(fēng)格中的作用,感興趣的朋友可以參考下2015-08-08Asp.Net中的字符串和HTML十進(jìn)制編碼轉(zhuǎn)換實現(xiàn)代碼
這篇文章主要介紹了Asp.Net中的字符串和HTML十進(jìn)制編碼轉(zhuǎn)換實現(xiàn)代碼,本文一并列出了javascript語言的實現(xiàn)方法,用以實現(xiàn)字符串和HTML十進(jìn)制編碼之間互相轉(zhuǎn)換功能,需要的朋友可以參考下2014-08-08asp.net5中用戶認(rèn)證與授權(quán)(2)
ASP.NET5主要提供了兩種應(yīng)用程序,其一就是ASP.NET5控制臺程序,另外一個是ASP.NET Web 應(yīng)用程序。本文給大家介紹asp.net5中用戶認(rèn)證與授權(quán)(2),需要的童鞋可以參考下2015-10-10