4.2 选项
4.2.1 什么是选项
选项是 ASP.NET Core
推荐的动态读取配置的方式,这种方式将配置文件数据用一个强类型来托管,能够实现配置验证、默认值配置、实时读取等功能。
4.2.2 与配置的区别
选项实际上也是配置,但在后者的基础上添加了配置验证、默认值/后期配置设定及提供了多种接口读取配置信息,同时还支持供配置更改通知等强大灵活功能。
所以,除了一次性读取使用的配置以外,都应该选用 选项 替换 配置。
知识导航
有关配置说明可查看《4.1 配置》 章节。
4.2.3 选项的使用
假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:
4.2.3.1 配置 appsettings.json
信息
{
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company": "Baiqian"
}
}
4.2.3.2 创建 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
命名空间下。
4.2.3.3 注册 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>();
}
}
}
4.2.3.4 读取 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)
。
- App.GetConfig<TOptions>(path)
- 依赖注入方式
- App.GetOptions<TOptions>()
using Furion.Application;
using Microsoft.AspNetCore.Mvc;
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get()
{
// 不推荐采用此方式读取,该方式仅在 ConfigureServices 启动时使用
var appInfo = App.GetConfig<AppInfoOptions>("AppInfo", true);
return $@"名称:{appInfo.Name},
版本:{appInfo.Version},
公司:{appInfo.Company}";
}
}
}
using Furion.Application;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
private readonly AppInfoOptions options1;
private readonly AppInfoOptions options2;
private readonly AppInfoOptions options3;
public DefaultController(
IOptions<AppInfoOptions> options
, IOptionsSnapshot<AppInfoOptions> optionsSnapshot
, IOptionsMonitor<AppInfoOptions> optionsMonitor)
{
options1 = options.Value;
options2 = optionsSnapshot.Value;
options3 = optionsMonitor.CurrentValue;
}
[HttpGet]
public string Get()
{
var info1 = $@"名称:{options1.Name},
版本:{options1.Version},
公司:{options1.Company}";
var info2 = $@"名称:{options2.Name},
版本:{options2.Version},
公司:{options2.Company}";
var info3 = $@"