3、带你一步一步学习ASP.NET Core中的配置之Configuration

        如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了。那么你肯定好奇,现在在ASP.NET Core应用程序中,是通过什么来配置我们的配置信息呢? 下面就跟着我一起来学习了解吧,在ASP.NET Core中是如何配置我们的配置信息,如果读取配置信息的。

       在ASP.NET Core 中是使用一个或者多个配置提供程序来配置我们的应用程序的。配置提供程序可以从各种不同的配置源中,读取我们配置的信息,这些配置源有下面这些:

  • 一种是配置文件,例如JSON、XML、INI文件等
  • 环境变量
  • Azure Key Vault
  • Azure App Configuration
  • 命令行参数(Command-line arguments)
  • 自定义的配置提供程序,安装或创建(Custom providers,Installed or created)
  • 目录文件 (Directory Files)
  • 内存中的.NET对象(In-Menory .NET objects)
  • 在这篇文章中,我将带领大家学习,如何通过JSON、INI、XML文件来配置、读取我们的配置信息,同样在这里面我还会教大家一种通用的方式,读取配置信息,它就是:使用自定义类来读取配置信息,这种方式叫做选项模式读取配置信息。

           首先我们来看看ASP.NET Core中的默认的配置吧,我们新建一个空白的ASP.NET Core应用程序,名字这里我取:MyConfiguration,框架选择当前最新的.net 5.0.

    image

    image

    image

    image

    image

            可以看到默认生成了5个文件和一个文件夹properties,分别是:appsettings.json、appsettings.Development.json、Program.cs、Startup.cs,还有一个名字为Properties的文件夹,里面有一个launchSettings.json文件。

             我们来先看一看,Program.cs文件:

    image

             Program.cs文件中有两个方法,一个是我们熟悉的Main函数,一个是CreateHostBuilder函数。CreateHostBuilder函数为我们创建了主机。然后在Main函数中调用这个CreateHostBuilder方法,也就是程序启动就会创建主机。

             CreateHostBuilder为我们的应用程序提供了默认的配置,这些默认的配置的顺序如下:

  • ChainedConfigurationProvider : 链式配置提供程序,它将现有的IConfiguration作为源。在默认情况下,如果没有任何主机配置以及设置的时候,这个就是第一个配置提供程序。
  • appsettings.json :它使用JSON 配置提供程序。
  • appsettings.Envirent.json   它也是使用JSOn配置提供程序的。例如,生产环境就是这个文件appsettings.Production.json,开发环境下,对应的就是:appsettings.Development.json文件。
  • App secrets 当应用程序的运行环境是Development的时候。
  • 环境变量(Environment variables)使用的是环境变量配置提供程序(Environment Variables configuration provider
  • 命令行参数(Command-line arguments)使用的是命令行配置提供程序(Command-line configuration provider)
  •          需要牢牢记在脑海中的是:在上面6个配置提供程序中,后出来的配置,会重写之前的配置。例如:如果我们在appsetting.json以及appsetting.Environment.json文件中,为同一个配置,都设置了值,那么appsetting.Environment.json文件中,设置的这个值将会被使用。使用默认的配置提供程序的顺序,那么命令行配置提供程序将会重写所有在它之前的配置提供程序的配置。

            想要连接更多关于CreateHostBuilder方法为我们做了什么,可以看这个微软官方文档:Default builder settings

            这篇文章,我的重心就是带领大家学习如果通过文件配置提供程序来配置、读取我们的配置信息,也就是如何从JSON、INI、XML文件中读取配置信息。

    从Json文件中读取配置信息

    打开appsettings.json文件,添加如下配置信息:

    image

    同样在appsetting.Development.json文件中,加上类似的

    image

    现在我们要做的就是来读取这些配置信息。

    首先空白的模板是没有控制器等文件夹的,我们要做的就是自己一步一步搭建好。

    创建好一个Controllers文件夹,在里面新建一个空白的HomeController控制器。在Home控制器中写上如下代码:

    image

    Index视图代码:

    image

    然后打开Startup.cs文件,需要修改两处:

    image

    然后运行程序:

    image

    可以看到读取的配置信息是appsetting.Development.json文件中的。这是因为我们应用程序默认的环境就是设置的Development。

    image

    默认的JsonConfigurationProvider ,首先是从appsetting.json文件中读取配置,然后appsettings.Environment.json文件中的配置就会加载,然后就会重写了appsettings.json文件中的配置了。

  • 在开发环境中(Development),appsettings.Development.json文件,重写appsettings.json文件中的配置;
  • 在生产环境中(Production),appsettings.Production.json文件,重写appsettings。json文件中的配置。
  • 如果我们把ASPNETCORE_ENVIRONMENT改成【Production】,再运行程序,就会发现:读取的是appsetting.json文件中的配置信息了,因为在这里,我们没有appsettings.Production.json文件。所以就会去读取appsettings.json文件。

    image

    image

    这种方式,我们在程序运行的时候,修改appetttings.json文件,按回车键,会自动获取最新的配置。例如我们在运行的时候,修改一下appsettings.json文件:

    image

    可以看到最新的【不用重新运行,直接刷新网页就能获取最新的配置信息】:

    image

    使用选项模式读取应用程序的配置

           如果你打算构建大型的应用程序,势必就会有很多的配置信息。或者当你有很多层级的配置信息需要去读取,像上面例子那样,通过Configuration和冒号一个一个的读取方式是不可取的。并且还有机会,因为错误的拼写,导致你读取配置的时候发生异常。推荐读取配置的方式就是使用选项模式。

           选项模式使用类,来提供对配置信息进行强类型的读取。废话不多说,我们开干!

    新建一个Common文件夹,新建一个类叫做ApplicationOptions,写上这些代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;

    namespace MyConfiguration.Common
    {
         public class ApplicationOptions
         {
             /// <summary>
             /// 配置中的MyApplication键值
             /// </summary>
             public const string MyApplication = “MyApplication”;

            /// <summary>
             /// 配置文件中的Name
             /// </summary>
             public string Name { get; set; }

            /// <summary>
             /// 配置文件中的Version
             /// </summary>
             public string Version { get; set; }

            public string DefaultUrl { get; set; }

            /// <summary>
             /// 配置中的Support子节点
             /// </summary>
             public SupportOption Support { get; set; }
         }

        /// <summary>
         /// SupportOption
         /// </summary>
         public class SupportOption
         {
             public const string Support = “Support”;
             /// <summary>
             /// 配置中的Email
             /// </summary>
             public string Email { get; set; }

            /// <summary>
             /// 配置中的Phone
             /// </summary>
             public string Phone { get; set; }

        }
    }

           我们需要时刻铭记的是:当我们使用选项模式的时候,我们需要创建一个类,定义一些字段和属性来读取配置文件中的信息:

  • 这个类不能是抽象类,并且这个类需要有一个无参数的构造函数
  • 配置文件中,所有可以读写的属性,在这个类中,必须要都绑定好(也就是要够申明成可以读写的属性)
  • 字段不能绑定。例如这个例子中的MyApplicationSupport常量,就没有绑定。
  •      为了绑定我们的配置,我们需要调用ConfigurationBinder.Bind方法,具体做法如下:

    image

    然后我们运行程序:

    image

    我们直接修改一下appsettings.json文件:

    image

      然后刷新页面:

    image       可以看到不用停止程序,直接修改json配置文件,便直接可以读取最新修改的配置信息。

           另外上面的代码,我们是通过:IConfiguration.Bind方法绑定的,还可以使用Get方法绑定。

    image

    我们可以这样:上面两句代码,可以用下面这一行代替。运行的结果也是一样的。

    image

    image

    修改一下appsettings.json文件:

    image

    然后刷新一下页面,也获取到了最新修改后的配置信息:

    image

    使用依赖注入,注入我们的ApplicationOptions类

            在上面所有的例子中,我都是直接在一个标准的控制器中读取我们的配置信息,如果你有一个大型的应用程序,需要在不同的控制器中读取配置信息,我们该怎么做呢?难道在每一个控制器中都写重复的读取配置的代码么?推荐的方式是在Stratup.cs文件中的ConfigureServices方法中,使用依赖注入的方式,注入我们的选项模式的自定义类。请看下面的代码:

    image

    image

    运行程序:

    image

    image

    修改一下配置文件:刷新页面,发现还是没有变化,没有获取最新的1.3版本和最新的Email信息。

    image

    除非重新关闭程序,重新运行程序:才能获取最新的配置信息,所以这种依赖注入的方式,就这点毛病,需要重启一下程序。

    image

    使用XML配置提供程序

    我们有这样的一个XML文件:

    image

    Program类:我们做如下修改

    image

    控制器类:

    image

    运行程序:读取到了XML中的配置信息。

    image

    修改一下XML文件

    image

    刷新页面获取到了最新的XML配置:

    image

    使用INI配置提供程序

    INI文件如下:

    image

    Program类中代码:

    image

    控制器中代码:

    image

    运行程序:读取到了INI文件中的配置信息了。

    image

            好了,以上就是ASP.NET Core中如何读取配置信息的内容,后面两种XML和INI读取配置的方式,因为篇幅的原因,就只是粘贴了核心代码,相信大家也能看得懂。希望我的这篇文章能够帮到你 ,如果觉得我写的不错,可以点个赞,帮忙分享,转载,请注明原文链接,谢谢合作。我是灰太狼的梦想,一个自强不息,脚踏实地的程序猿。