ASP.NET Core内置集成了一套配置框架,我们能够很容易的实现读取配置文件、分环境配置等功能。
ASP.NET Core内置的配置框架中默认集成了一组配置提供者,实际上我们也可以修改甚至自定义ASP.NET Core的配置提供者,但实际开发中一般不需要这么做,我们在默认的配置提供者对应的地方编写配置即可。默认的配置提供者和其加载顺序如下:
IConfiguration
appsettings.json
appsettings.[环境名].json
实际开发中,我们大部分的配置一般都写在appsettings.json
和对应环境的appsettings.[环境名].json
配置文件中。
在Visual Studio中创建一个工程后,默认会生成appsettings.json
和appsettings.Development.json
两个配置文件,它们就是ASP.NET Core中默认约定加载的配置文件。默认生成的配置如下。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
文件名中,Development
是指用于开发环境的配置,如果我们有开发、测试、生产等不同环境,可以增加对应的appsettings.[环境名].json
配置文件。这个环境名是可以任意自定义的,但推荐优先使用Development
、Staging
、Production
这三个值,app.Environment
对象提供了类似app.Environment.IsDevelopment()
的预制方法来支持这三个值的判断。
在程序启动时,程序会读取ASPNETCORE_ENVIRONMENT
环境变量,例如将该环境变量指定为Development
,程序启动时就会将appsettings.Development.json
和appsettings.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()
方法来读取配置,然后使用IConfigurationSection
的Get()
方法来获取绑定的对象。
在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
还有很多其它的方法用来读取配置,具体可以参考相关文档。