应用配置

ASP.NET Core内置集成了一套配置框架,我们能够很容易的实现读取配置文件、分环境配置等功能。

默认配置提供者

ASP.NET Core内置的配置框架中默认集成了一组配置提供者,实际上我们也可以修改甚至自定义ASP.NET Core的配置提供者,但实际开发中一般不需要这么做,我们在默认的配置提供者对应的地方编写配置即可。默认的配置提供者和其加载顺序如下:

  1. 加载现有的IConfiguration
  2. 加载项目根目录的appsettings.json
  3. 加载项目根目录的appsettings.[环境名].json
  4. 加载用户机密配置
  5. 加载环境变量中的配置
  6. 加载命令行中的配置

实际开发中,我们大部分的配置一般都写在appsettings.json和对应环境的appsettings.[环境名].json配置文件中。

appsettings.json 应用配置文件

在Visual Studio中创建一个工程后,默认会生成appsettings.jsonappsettings.Development.json两个配置文件,它们就是ASP.NET Core中默认约定加载的配置文件。默认生成的配置如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

文件名中,Development是指用于开发环境的配置,如果我们有开发、测试、生产等不同环境,可以增加对应的appsettings.[环境名].json配置文件。这个环境名是可以任意自定义的,但推荐优先使用DevelopmentStagingProduction这三个值,app.Environment对象提供了类似app.Environment.IsDevelopment()的预制方法来支持这三个值的判断。

在程序启动时,程序会读取ASPNETCORE_ENVIRONMENT环境变量,例如将该环境变量指定为Development,程序启动时就会将appsettings.Development.jsonappsettings.json合并作为应用配置。我们可以通过app.Environment.EnvironmentName读取当前环境,也可以用app.Environment.IsDevelopment()等方法判断当前环境。

读取应用配置文件

假设我们有这样的一段配置:

{
  "BlogTitle": "Gacfox's Blog",
  "PostConfig": {
    "AllowPost":  false
  }
}

Program.cs中,我们可以通过WebApplication对象的Configuration属性来读取配置,它是一个IConfiguration类型的对象,我们可以调用其中的各种方法来加载配置。

string blogTitle = app.Configuration.GetValue<string>("BlogTitle");
bool allowPost = app.Configuration.GetValue<bool>("PostConfig:AllowPost");

这里我们使用了GetValue()方法来读取配置。除此之外,我们也可以将JSON配置绑定到一个对象上,下面是一个例子。

public class PostConfig
{
    public bool AllowPost { get; set; }
}
PostConfig postConfig = app.Configuration.GetSection("PostConfig").Get<PostConfig>();

这里我们使用了GetSection()方法来读取配置,然后使用IConfigurationSectionGet()方法来获取绑定的对象。

在Controller等由IoC容器托管的类中,我们可以通过构造函数注入IConfiguration对象,然后读取配置,下面是一个例子。

using DemoWebAPI.Model;
using Microsoft.AspNetCore.Mvc;

namespace DemoWebAPI.Controllers;

[ApiController]
[Route("api/[controller]")]
public class DemoController : ControllerBase
{
    private IConfiguration _configuration;

    public DemoController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet]
    [Route("[action]")]
    public ActionResult<ApiResult> DemoAction()
    {
        string blogTitle = _configuration.GetValue<string>("BlogTitle");
        Console.WriteLine(blogTitle);

        return ApiResult.Success();
    }
}

代码中,我们通过构造函数注入了IConfiguration对象,在DemoAction()方法中我们通过GetValue()方法读取配置值。除了上面介绍的GetValue()GetSection()IConfiguration还有很多其它的方法用来读取配置,具体可以参考相关文档。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap