• .NetCore基础之读取配置文件


    在应用程序开发中,配置文件是主要存储系统的初始配置信息,配置文件的读取虽然属于基础内容却又经常用到,所以百丈高楼平地起,学习.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接口操作的,实例化接口对象如下所示:

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

    3. 通过索引器进行读取

    默认情况下,IConfiguration接口提供了索引器,以Key为参数进行读取,返回字符串对象,如下所示:

    1 var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字
    2 var like0 = configuration["Like:0"];//读取数组中第一个元素 如:第一个爱好
    3 var like2 = configuration["Like:2"];//读取数组中第三个元素 如:第三个爱好
    4 var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩

    注意:如果Json数据有层级关系,则通过冒号【:】进行表示。

    4. 通过GetValue<T>()方法进行读取

    通过索引器只能返回字符串类型的值,如果需要读取其他简单类型的对象,如:int,float等,则可以通过GetValue<T>()方法进行,具体如下所示:

    1 var age = configuration.GetValue<int>("Age");//获取其他数据类型,如:int,如:年龄

    5. 读取数组

    通过索引器和泛型方法,可以读取简单类型的对象,如果需要读取复杂对象【如:数组,列表等】,则需要使用绑定,如下所示:

    1 //获取整个数组,如:爱好
    2 var like = new List<string>();
    3 configuration.Bind("Like",like);

    6. 整体对象绑定

    以上示例都是对Json文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:

    首先复制整个Json文件的内容,然后依次点击【编辑-->选择性粘贴-->将JSON粘贴为类】菜单,如下所示:

     默认生成的类名为RootObject,然后修改为Student,具体如下所示:

     1 namespace DemoCore
     2 {
     3     public class Student
     4     {
     5         public string Name { get; set; }
     6         public int Age { get; set; }
     7         public string Sex { get; set; }
     8         public string[] Like { get; set; }
     9         public Score Score { get; set; }
    10     }
    11 
    12     public class Score
    13     {
    14         public int LandLit { get; set; }
    15         public int Mathematics { get; set; }
    16         public int English { get; set; }
    17     }
    18 
    19 }

    将Student类和配置对象进行绑定,如下所示:

    1 //2. 复杂读取
    2 var student = new Student();
    3 configuration.Bind(student);
    4 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文件,如下所示:

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <Student>
     3     <Name>Alan.hsiang</Name>
     4     <Age>20</Age>
     5     <Sex>male</Sex>
     6     <Likes>
     7         <Like>basketball</Like>
     8         <Like>football</Like>
     9         <Like>swimming</Like>
    10     </Likes>
    11     <Score>
    12         <LandLit>90</LandLit>
    13         <Mathematics>98</Mathematics>
    14         <English>60</English>
    15     </Score>
    16 </Student>

    2. 简单读取

    通过索引器和GetValue可以进行读取,如下所示:

    1 //1. 基础读取
    2 
    3 var age = configuration.GetValue<int>("Age");//获取其他数据类型,如:int,如:年龄
    4 var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字
    5 var like0 = configuration["Likes:Like:0"];//读取数组中第一个元素 如:第一个爱好
    6 var like2 = configuration["Likes:Like:2"];//读取数组中第三个元素 如:第三个爱好
    7 var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩

    注意:读取数组中的元素时,和json读取不同,因为json中是一个节点,但是在xml中是三个节点。

    3. 读取数组

    读取XML中的数组列表,如下所示:

    1 //获取整个数组,如:爱好
    2 var like = new List<string>();
    3 configuration.Bind("Likes:Like", like);
    4 Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");

    4. 整体绑定对象

    以上示例都是对XML文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:

    首先复制整个XML文件的内容,然后依次点击【编辑-->选择性粘贴-->将XML粘贴为类】菜单,如下所示:

     默认生成的类,类名与XML的根节点保持一致,如下所示:

      1 namespace DemoCore
      2 {
      3     // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。
      4     /// <remarks/>
      5     [System.SerializableAttribute()]
      6     [System.ComponentModel.DesignerCategoryAttribute("code")]
      7     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
      8     [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
      9     public partial class Student
     10     {
     11 
     12         private string nameField;
     13 
     14         private byte ageField;
     15 
     16         private string sexField;
     17 
     18         private string[] likesField;
     19 
     20         private StudentScore scoreField;
     21 
     22         /// <remarks/>
     23         public string Name
     24         {
     25             get
     26             {
     27                 return this.nameField;
     28             }
     29             set
     30             {
     31                 this.nameField = value;
     32             }
     33         }
     34 
     35         /// <remarks/>
     36         public byte Age
     37         {
     38             get
     39             {
     40                 return this.ageField;
     41             }
     42             set
     43             {
     44                 this.ageField = value;
     45             }
     46         }
     47 
     48         /// <remarks/>
     49         public string Sex
     50         {
     51             get
     52             {
     53                 return this.sexField;
     54             }
     55             set
     56             {
     57                 this.sexField = value;
     58             }
     59         }
     60 
     61         /// <remarks/>
     62         [System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)]
     63         public string[] Likes
     64         {
     65             get
     66             {
     67                 return this.likesField;
     68             }
     69             set
     70             {
     71                 this.likesField = value;
     72             }
     73         }
     74 
     75         /// <remarks/>
     76         public StudentScore Score
     77         {
     78             get
     79             {
     80                 return this.scoreField;
     81             }
     82             set
     83             {
     84                 this.scoreField = value;
     85             }
     86         }
     87     }
     88 
     89     /// <remarks/>
     90     [System.SerializableAttribute()]
     91     [System.ComponentModel.DesignerCategoryAttribute("code")]
     92     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
     93     public partial class StudentScore
     94     {
     95 
     96         private byte landLitField;
     97 
     98         private byte mathematicsField;
     99 
    100         private byte englishField;
    101 
    102         /// <remarks/>
    103         public byte LandLit
    104         {
    105             get
    106             {
    107                 return this.landLitField;
    108             }
    109             set
    110             {
    111                 this.landLitField = value;
    112             }
    113         }
    114 
    115         /// <remarks/>
    116         public byte Mathematics
    117         {
    118             get
    119             {
    120                 return this.mathematicsField;
    121             }
    122             set
    123             {
    124                 this.mathematicsField = value;
    125             }
    126         }
    127 
    128         /// <remarks/>
    129         public byte English
    130         {
    131             get
    132             {
    133                 return this.englishField;
    134             }
    135             set
    136             {
    137                 this.englishField = value;
    138             }
    139         }
    140     }
    141 
    142 
    143 }

    但是默认生成的类,在转换成数组时存在问题,所以需要细微调整,如下所示:

      1 namespace DemoCore
      2 {
      3     // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。
      4     /// <remarks/>
      5     [System.SerializableAttribute()]
      6     [System.ComponentModel.DesignerCategoryAttribute("code")]
      7     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
      8     [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
      9     public partial class Student
     10     {
     11 
     12         private string nameField;
     13 
     14         private byte ageField;
     15 
     16         private string sexField;
     17 
     18         private LikesLike likesField;
     19 
     20         private StudentScore scoreField;
     21 
     22         /// <remarks/>
     23         public string Name
     24         {
     25             get
     26             {
     27                 return this.nameField;
     28             }
     29             set
     30             {
     31                 this.nameField = value;
     32             }
     33         }
     34 
     35         /// <remarks/>
     36         public byte Age
     37         {
     38             get
     39             {
     40                 return this.ageField;
     41             }
     42             set
     43             {
     44                 this.ageField = value;
     45             }
     46         }
     47 
     48         /// <remarks/>
     49         public string Sex
     50         {
     51             get
     52             {
     53                 return this.sexField;
     54             }
     55             set
     56             {
     57                 this.sexField = value;
     58             }
     59         }
     60 
     61         /// <remarks/>
     62         [System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)]
     63         public LikesLike Likes
     64         {
     65             get
     66             {
     67                 return this.likesField;
     68             }
     69             set
     70             {
     71                 this.likesField = value;
     72             }
     73         }
     74 
     75         /// <remarks/>
     76         public StudentScore Score
     77         {
     78             get
     79             {
     80                 return this.scoreField;
     81             }
     82             set
     83             {
     84                 this.scoreField = value;
     85             }
     86         }
     87     }
     88 
     89     /// <remarks/>
     90     [System.SerializableAttribute()]
     91     [System.ComponentModel.DesignerCategoryAttribute("code")]
     92     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
     93     public partial class StudentScore
     94     {
     95 
     96         private byte landLitField;
     97 
     98         private byte mathematicsField;
     99 
    100         private byte englishField;
    101 
    102         /// <remarks/>
    103         public byte LandLit
    104         {
    105             get
    106             {
    107                 return this.landLitField;
    108             }
    109             set
    110             {
    111                 this.landLitField = value;
    112             }
    113         }
    114 
    115         /// <remarks/>
    116         public byte Mathematics
    117         {
    118             get
    119             {
    120                 return this.mathematicsField;
    121             }
    122             set
    123             {
    124                 this.mathematicsField = value;
    125             }
    126         }
    127 
    128         /// <remarks/>
    129         public byte English
    130         {
    131             get
    132             {
    133                 return this.englishField;
    134             }
    135             set
    136             {
    137                 this.englishField = value;
    138             }
    139         }
    140     }
    141 
    142     public partial class LikesLike { 
    143         public string[] Like { get; set; }
    144     }
    145 }

    然后在读取时,进行整体绑定,如下所示:

    1 //2. 复杂读取
    2 var student = new Student();
    3 configuration.Bind(student);
    4 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表示内容。如下所示:

    1 ;此处表示注释 
    2 [student]
    3 Name=Alan.hsiang
    4 Age=20
    5 Grade=4

    2. 创建配置并读取

    在.Net Core中读取ini文件的步骤,非常简单,如下所示:

    1 private static void ReadIni() {
    2     IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddIniFile("student.ini").Build();
    3     string name = configuration["student:Name"];//如果没有节点,则直接用key进行获取即可
    4     var age = configuration.GetValue<int>("student:Age");
    5     var grade = configuration.GetValue<int>("student:Grade");
    6     Console.WriteLine($"name={name},age={age},grade= {string.Join(",", grade)}");
    7  }

    注意:由于ini文件不涉及复杂的数据结构,所以直接通过索引器和GetValue即可。

    3. 示例截图

    读取ini文件的示例截图如下所示:

     读取环境变量

    环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。

    1. 查看环境变量

    在win10操作系统中,此电脑-->右键-->属性-->高级系统设置-->环境变量-->然后打开环境变量对话框。如下所示:

    环境变量分为用户变量【当前用户】,和系统变量【全部用户】,如下所示:

    2. 简单读取 

    在.NetCore中读取环境变量的值,如下所示:

     1 private static void ReadEnvironmentVariable() {
     2       IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddEnvironmentVariables().Build();
     3        var path = configuration["Path"];
     4        var temp = configuration["TEMP"];
     5        var os = configuration["OS"];
     6        var arr = path.Split(";");
     7        Console.WriteLine("path:");
     8        foreach (var a in arr)
     9        {
    10            Console.WriteLine(a);
    11        }
    12        Console.WriteLine($"temp={temp}\n os= {os}");
    13 }

    3. 示例截图

    读取环境变量示例截图如下所示:

    备注

    以上是在.Net Core中读取几种常见数据的方式,旨在抛砖引玉,共同学习,一起进步。

    千秋岁·数声鶗鴂【作者】张先 【朝代】宋

     数声鶗鴂。又报芳菲歇。惜春更把残红折。雨轻风色暴,梅子青时节。永丰柳,无人尽日飞花雪。

    莫把幺弦拨。怨极弦能说。天不老,情难绝。心似双丝网,中有千千结。夜过也,东窗未白凝残月。

  • 相关阅读:
    使SourceInsight支持Python语言的方法
    图解Join
    EularProject 42:单词解码出来的三角形数
    android-async-http二次封装和调用
    #20 Valid Parentheses
    udev详解【转】
    linux下udev简介【转】
    Linux USB 驱动开发(一)—— USB设备基础概念【转】
    Android updater-scripts(Edify Script)各函数详细说明【转】
    OTA制作及升级过程笔记【转】
  • 原文地址:https://www.cnblogs.com/hsiang/p/15953145.html
Copyright © 2020-2023  润新知