ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做Options对象。也可以叫做配置对象。
以下大多内容来自官方文档,我只是个翻译官或者叫搬运工吧!
引入Options扩展包
PM>Package-install Microsoft.Extensions.Options
绑定分层配置
在appsetting.json文件增加如下配置
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}
创建以下 PositionOptions 类:
public class PositionOptions
{
public const string Position = "Position";
public string Title { get; set; }
public string Name { get; set; }
}
选项类:
必须是包含公共无参数构造函数的非抽象类。 类型的所有公共读写属性都已绑定。 不会绑定字段。 在上面的代码中,Position 未绑定。 由于使用了 Position 属性,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 "Position" 进行硬编码。类绑定
调用 ConfigurationBinder.Bind 将 PositionOptions 类绑定到 Position 部分。然后就可以用了,当然这种方式在开发.NET Core种并不常用,一般采用依赖注入的方式注入。
var positionOptions = new PositionOptions(); Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);
使用 ConfigurationBinder.Get 可能比使用 ConfigurationBinder.Bind 更方便。
positionOptions = Configuration.GetSection(PositionOptions.Position).Get<PositionOptions>();
依赖项注入服务容器
修改ConfigureServices方法
public void ConfigureServices(IServiceCollection services)
{
services.Configure<PositionOptions>(Configuration.GetSection(
PositionOptions.Position));
services.AddRazorPages();
}
通过使用前面的代码,以下代码将读取位置选项:
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}");
}
}
选项接口
初学者会发现这个框架有3个主要的面向消费者的接口:IOptions、IOptionsMonitor以及IOptionsSnapshot。
这三个接口初看起来很类似,所以很容易引起困惑,什么场景下该用哪个接口呢?
1.IOptions
不支持(1)在应用启动后读取配置数据。
(2)命名选项








