本文章翻译自微软官方文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-7.0
接上篇 ASP.NET Core中的配置项Configuration(一)
appsettings.json文件中的注释
在appsettings.json和appsettings.{Environment}.json文件中的注释支持使用JavaScript或者 C#风格的注释.
使用选项模式绑定分层配置数据
读取关联配置值的首选方式是使用选项模式。比如,读取以下配置值:
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
创建以下PositionOptions类:
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}
一个选项类要满足如下要求:
- 必须是包含无参构造函数的非抽象类
- 类型的所有公共读写属性都已绑定。
- 字段不是绑定的。 在上面的代码中,Position 未绑定。 由于使用了 Position 字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 "Position" 进行硬编码。
接着看下面的代码:
- 调用ConfigurationBinder.Bind方法把PositionOptions类绑定到Position配置节点
- 显示Position节点的配置数据
public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;
public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
在上面的代码中,默认情况下,在应用启动后对json配置文件的修改会读取到。
ConfigurationBinder.Get<T>方法可以先绑定指定的类型然后返回相应数据。使用ConfigurationBinder.Get<T>方法可能比使用ConfigurationBinder.Bind方法更方便。以下代码将展示如何将ConfigurationBinder.Get<T>方法和PositionOptions类配合使用:
public class Test21Model : PageModel
{
private readonly IConfiguration Configuration;
public PositionOptions? positionOptions { get; private set; }
public Test21Model(IConfiguration configuration)
{
Configuration = configuration;
}
public ContentResult OnGet()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();
return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}
在上面的代码中,默认情况下,在应用启动后对json配置文件的修改会读取到。
在使用选项模式时的另一种方法是绑定Position 配置节点并加入到依赖注入服务容器中。在以下代码中,PositionOptions类已被使用Configure添加到了服务容器中并且已绑定到了配置:
using ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<PositionOptions>(
builder.Configuration.GetSection(PositionOptions.Position));
var app = builder.Build();
通过使用前面的代码,以下代码将读取到position配置节点:
public class Test2Model : PageModel
{
private readonly PositionOptions _options;
public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}
public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}
在以上代码中,应用启动后对 JSON配置文件的更改将无法读取到。如果想要读取到应用启动后的更改,请使用IOptionsSnapshot。
使用默认配置情况下,appsettings.json和appsettings.{Environment}.json文件会启用reloadOnChange: true配置。应用启动后对appsettings.json和appsettings.{Environment}.json文件的更改将会被 JSON configuration provider读取。