溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

.NetCore中如何讀取配置文件

發(fā)布時(shí)間:2022-03-07 09:39:04 來(lái)源:億速云 閱讀:286 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下.NetCore中如何讀取配置文件,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在應(yīng)用程序開發(fā)中,配置文件是主要存儲(chǔ)系統(tǒng)的初始配置信息,配置文件的讀取雖然屬于基礎(chǔ)內(nèi)容卻又經(jīng)常用到,所以百丈高樓平地起,學(xué)習(xí).Net Core,就從學(xué)習(xí)配置文件開始。在.net framework時(shí)代,配置文件主要是xml格式【web.config,app.config】,且每次修改,需要重啟,但是在.Net Core中,由于跨平臺(tái)的關(guān)系,配置文件多以json【appsetting.json】的形式存在,且可以進(jìn)行熱加載。本文以一些簡(jiǎn)單的小例子,簡(jiǎn)述如何在.Net Core中進(jìn)行配置文件【Json,xml,ini,環(huán)境變量等】的讀取,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。

涉及知識(shí)點(diǎn)

在本例中,主要進(jìn)行.Net Core開發(fā)環(huán)境下的配置文件讀取,涉及知識(shí)點(diǎn)如下:

 IConfiguration:.Net Core中應(yīng)用程序配置的操作接口,主要提供了對(duì)Json,xml,ini ,環(huán)境變量,內(nèi)存數(shù)據(jù)等的讀取功能。

ConfigurationBuilder:用于構(gòu)建應(yīng)用程序配置接口的構(gòu)建器工具類。

安裝插件

在.Net Core中,要實(shí)現(xiàn)配置文件的讀取,需要依賴以下幾個(gè)插件包,可以通過(guò)Nuget進(jìn)行安裝。具體如下所示:

.NetCore中如何讀取配置文件

注意:.Net Core對(duì)不同文件的解析,在不同的插件庫(kù)中,可以根據(jù)實(shí)際項(xiàng)目需要分別進(jìn)行安裝。此處也體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想【如:開閉原則,單一職責(zé)原則】。

讀取Json文件

1. 準(zhǔn)備數(shù)據(jù)

首先準(zhǔn)備一個(gè)Json文件,如下所示:

{
  "Name": "Alan.hsiang",
  "Age": 20,
  "Sex": "male",
  "Like": ["basketball","football","swimming"],
  "Score": {
    "LandLit": 90,
    "Mathematics": 99,
    "English": 50
  }
}

2. 創(chuàng)建IConfiguration接口實(shí)例

在.Net Core中,讀取配對(duì)文件是通過(guò)IConfiguration接口操作的,實(shí)例化接口對(duì)象如下所示:

IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("student.json").Build();

3. 通過(guò)索引器進(jìn)行讀取

默認(rèn)情況下,IConfiguration接口提供了索引器,以Key為參數(shù)進(jìn)行讀取,返回字符串對(duì)象,如下所示:

 var name = configuration["Name"]; //IConfiguration接口自帶的索引器,只返回字符串類型。如:名字
 var like0 = configuration["Like:0"];//讀取數(shù)組中第一個(gè)元素 如:第一個(gè)愛好
 var like2 = configuration["Like:2"];//讀取數(shù)組中第三個(gè)元素 如:第三個(gè)愛好
 var landLit = configuration["Score:LandLit"];//獲取字節(jié)點(diǎn)的屬性值,如:語(yǔ)文成績(jī)

注意:如果Json數(shù)據(jù)有層級(jí)關(guān)系,則通過(guò)冒號(hào)【:】進(jìn)行表示。

4. 通過(guò)GetValue<T>()方法進(jìn)行讀取

通過(guò)索引器只能返回字符串類型的值,如果需要讀取其他簡(jiǎn)單類型的對(duì)象,如:int,float等,則可以通過(guò)GetValue<T>()方法進(jìn)行,具體如下所示:

 var age = configuration.GetValue<int>("Age");//獲取其他數(shù)據(jù)類型,如:int,如:年齡

5. 讀取數(shù)組

通過(guò)索引器和泛型方法,可以讀取簡(jiǎn)單類型的對(duì)象,如果需要讀取復(fù)雜對(duì)象【如:數(shù)組,列表等】,則需要使用綁定,如下所示:

 //獲取整個(gè)數(shù)組,如:愛好
 var like = new List<string>();
 configuration.Bind("Like",like);

6. 整體對(duì)象綁定

以上示例都是對(duì)Json文件局部數(shù)據(jù)的讀取,那么可以將整個(gè)文件轉(zhuǎn)換為對(duì)象嗎?這樣直接操作對(duì)象將對(duì)很方便快捷。具體如下所示:

首先復(fù)制整個(gè)Json文件的內(nèi)容,然后依次點(diǎn)擊【編輯-->選擇性粘貼-->將JSON粘貼為類】菜單,如下所示:

.NetCore中如何讀取配置文件

默認(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類和配置對(duì)象進(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示例截圖

.NetCore中如何讀取配置文件

讀取XML文件

在應(yīng)用程序開發(fā)中,XML文件也是比較常用的一種配置文件。對(duì)XML文件的讀取操作和Json文件操作基本相似,具體如下所示:

1. 創(chuàng)建XML文件

首先創(chuàng)建一個(gè)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. 簡(jiǎn)單讀取

通過(guò)索引器和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ù)組中第一個(gè)元素 如:第一個(gè)愛好
var like2 = configuration["Likes:Like:2"];//讀取數(shù)組中第三個(gè)元素 如:第三個(gè)愛好
var landLit = configuration["Score:LandLit"];//獲取字節(jié)點(diǎn)的屬性值,如:語(yǔ)文成績(jī)

注意:讀取數(shù)組中的元素時(shí),和json讀取不同,因?yàn)閖son中是一個(gè)節(jié)點(diǎn),但是在xml中是三個(gè)節(jié)點(diǎn)。

3. 讀取數(shù)組

讀取XML中的數(shù)組列表,如下所示:

 //獲取整個(gè)數(shù)組,如:愛好
 var like = new List<string>();
 configuration.Bind("Likes:Like", like);
 Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");

4. 整體綁定對(duì)象

以上示例都是對(duì)XML文件局部數(shù)據(jù)的讀取,那么可以將整個(gè)文件轉(zhuǎn)換為對(duì)象嗎?這樣直接操作對(duì)象將對(duì)很方便快捷。具體如下所示:

首先復(fù)制整個(gè)XML文件的內(nèi)容,然后依次點(diǎn)擊【編輯-->選擇性粘貼-->將XML粘貼為類】菜單,如下所示:

.NetCore中如何讀取配置文件

默認(rèn)生成的類,類名與XML的根節(jié)點(diǎn)保持一致,如下所示:

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ù)組時(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; }
    }
}

然后在讀取時(shí),進(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. 示例截圖

.NetCore中如何讀取配置文件

注意:通過(guò)示例方向,讀取XML和讀取Json文件,存在細(xì)微的差異。

讀取INI文件

ini文件在C#程序中,一般應(yīng)用的不是很多,主要是鍵值對(duì)文件,主要用于存儲(chǔ)簡(jiǎn)單的數(shù)據(jù)格式,如下所示:

1. 創(chuàng)建ini文件

一般情況下,ini文件包括以下幾個(gè)部分:a. 注釋 用分號(hào)做前綴,b. 節(jié)點(diǎn)用中括號(hào)表示,c. key=value表示內(nèi)容。如下所示:

 ;此處表示注釋 
 [student]
 Name=Alan.hsiang
 Age=20
 Grade=4

2. 創(chuàng)建配置并讀取

在.Net Core中讀取ini文件的步驟,非常簡(jiǎn)單,如下所示:

private static void ReadIni() {
    IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddIniFile("student.ini").Build();
    string name = configuration["student:Name"];//如果沒有節(jié)點(diǎn),則直接用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),所以直接通過(guò)索引器和GetValue即可。

3. 示例截圖

讀取ini文件的示例截圖如下所示:

.NetCore中如何讀取配置文件

 讀取環(huán)境變量

環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來(lái)指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù),如:臨時(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)中,此電腦-->右鍵-->屬性-->高級(jí)系統(tǒng)設(shè)置-->環(huán)境變量-->然后打開環(huán)境變量對(duì)話框。如下所示:

.NetCore中如何讀取配置文件

環(huán)境變量分為用戶變量【當(dāng)前用戶】,和系統(tǒng)變量【全部用戶】,如下所示:

.NetCore中如何讀取配置文件

2. 簡(jiǎn)單讀取 

在.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)境變量示例截圖如下所示:

.NetCore中如何讀取配置文件

看完了這篇文章,相信你對(duì)“.NetCore中如何讀取配置文件”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI