















参考:https://furion.net/docs/configuration
参考:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/options?view=aspnetcore-9.0&preserve-view=true
优点
缺点
如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。
选项是 ASP.NET Core 推荐的动态读取配置的方式,这种方式将配置文件数据用一个强类型来托管,能够实现配置验证、默认值配置、实时读取等功能。
选项实际上也是配置,但在后者的基础上添加了配置验证、默认值/后期配置设定及提供了多种接口读取配置信息,同时还支持供配置更改通知等强大灵活功能。
所以,除了一次性读取使用的配置以外,都应该选用 选项 替换 配置。
假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:
appsettings.json 信息{
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company": "Baiqian"
}
}
AppInfoOptions 强类型类using Furion.ConfigurableOptions;
namespace Furion.Application
{
public class AppInfoOptions : IConfigurableOptions
{
public string Name { get; set; }
public string Version { get; set; }
public string Company { get; set; }
}
}
温馨提示
建议所有选项类都应该以 Options 命名结尾。
另外,Furion 框架提供了非常灵活的注册选项服务的方法,只需要继承 IConfigurableOptions 接口即可,该接口位于 Furion.ConfigurableOptions 命名空间下。
AppInfoOptions 服务选项不同于配置,需在应用启动时注册
Furion.Web.Core\FurWebCoreStartup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
namespace Furion.Web.Core
{
[AppStartup(800)]
public sealed class FurWebCoreStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddConfigurableOptions<AppInfoOptions>();
}
}
}
AppInfoOptions 信息在 Furion 框架中,提供了多种读取方式:
App.GetConfig<TOptions>(path) 读取(不推荐)IOptions<TOptions>IOptionsSnapshot<TOptions>IOptionsMonitor<TOptions>App 静态类提供的静态方法获取:
App.GetOptions<TOptions>()App.GetOptionsMonitor<TOptions>()App.GetOptionsSnapshot<TOptions>()特别注意
禁止在主机启动时通过 App.GetOptions<TOptions> 获取选项,如需获取配置选项理应通过 App.GetConfig<TOptions>("配置节点", true)。
using Furion.Application;
using Microsoft.AspNetCore.Mvc;
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get()
{
App.GetOptions<TOptions>()IOptions[Snapshot|Monitor]<TOptions> 读取App.GetOptions[Snapshot|Monitor]<TOptions>() 读取ASP.NET Core 应用提供了多种读取选项的接口:
IOptions<TOptions>:
IOptionsSnapshot<TOptions>:
IOptionsMonitor<TOptions>:
(IOptionsMonitorCache<TOptions>)注意事项
在使用 IConfigurableOptionsListener 监听选项后,如要获取最新的配置信息,请使用 App.GetOptionsMonitor<TOptions>() 而不是 App.GetOptions<TOptions>()。
我们知道,选项实际上需要和配置文件特定键值挂钩,那 Furion 是如何准确的找到配置文件中的键值的呢?
[OptionsSettings] 特性
Options 结尾,则去除 Options 字符串类名称[OptionsSettings] 特性
Path 属性,则返回 Path 的值类名称Options 结尾,则键名为:AppInfopublic class AppInfoOptions : IConfigurableOptions
{
public string Name { get; set; }
public string Version { get; set; }
public string Company { get; set; }
}
Options 结尾,则键名为:AppInfoSettingspublic class AppInfoSettings : IConfigurableOptions
{
public string Name { get; set; }
public string Version { get; set; }
public string Company { get; set; }
}
选项类可以通过 [OptionsSettings] 来配置查找路径值。
Path:对应配置文件中的键,支持 分层键 字符串,参见:《4.1 配置 - 4.1.3 路径符 查找节点》PostConfigureAll:选项后期配置,默认 false。ASP.NET Core - 选项 - 选项后期配置选项支持验证配置有效性,在 Furion 框架中,通过 services.AddConfigurableOptions<TOptions>() 注册选项默认启用了验证支持。
包括:
DataAnnotationsIValidateOptions<TOptions>using Furion.ConfigurableOptions;
using System.ComponentModel.DataAnnotations;
namespace Furion.Application
{
public class AppInfoOptions : IConfigurableOptions
{
[Required(ErrorMessage = "名称不能为空")]
public string Name { get; set; }
[Required, RegularExpression(@"^[0-9][0-9\.]+[0-9]$", ErrorMessage = "不是有效的版本号")]
public string Version { get; set; }
[Required, MaxLength(100)]
public string Company { get; set; }
}
}
特别说明
IConfigurableOptions<TOptions, TOptionsValidation> 继承自 IConfigurableOptions<TOptions>,也就是自定义复杂验证默认具有 PostConfigure(TOptions options) 选项后期配置方法。关于《4.2.8 选项后期配置》将在下一小节说明。
选项后期配置通俗一点来说,可以在运行时解析值或设定默认值/后期配置等。
在 Furion 框架中,配置选项后期配置很简单,只需要继承 IConfigurableOptions<TOptions> 接口并实现 PostConfigure(TOptions options) 方法。
using Furion.ConfigurableOptions;
using Microsoft.Extensions.Configuration;
using System.ComponentModel.DataAnnotations;
namespace Furion.Application
{
public class AppInfoOptions : IConfigurableOptions<AppInfoOptions>
{
[Required(ErrorMessage = "名称不能为空")]
public string Name { get; set; }
[Required]
public string Version { get; set; }
[Required, MaxLength(100)]
public string Company { get; set; }
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
options.Name ??= "Furion";
options.Version ??= "1.0.0";
options.Company ??= "Baiqian";
}
}