Options模式使用类来对配置项进行访问,这个类称为选项类。选项类有三个要求:
1.必须是包含无参构造函数的非抽象类。
2.类型的属性名称与配置键名称相同,拥有get和set。
3.使用一个属性包含键名称,不在类绑定配置程序的时候进行硬编码。
我们在appsettings.json中加入以下数据:
"MyKey": { "Name": "my name is tom", "Age": "my age is 12" }
然后建立一个选项类MyOptions:
public class MyOptions { public string Name { get; set; } public string Age { get; set; } }
在Starup.cs中如下代码:
app.Run(async context => { MyOptions myOptions = new MyOptions(); Configuration.GetSection("MyKey").Bind(myOptions);
//Configuration.GetSection("MyKey").Get<MyOptions>(); await context.Response.WriteAsync(myOptions.Name + "," + myOptions.Age); });
运行可以看到输出结果。输出的结果会随这appsettings.json的配置更改而更改哦。
选项接口
选项有三个接口IOptions、IOptionsSnapshot和IOptionsMonitor。这几个接口可用让Option类通过依赖注入的形式使用。
IOptions不支持再启动后读取配置变动的数据,不支持命名选项。注册为单一实例可以注入到任何服务周期。
IOptionsSnapshot在每次请求时读取配置项已更新的数据,注册为范围内,所以无法注入到单一服务实例。支持命名选项。
IOptionsMonitor支持读取配置项的更新、命名选项。注册为单一实例可以注入到任何服务周期。
它们的使用很简单:
public void ConfigureServices(IServiceCollection services) { services.Configure<MyOptions>(Configuration.GetSection(MyOptions.Position)); }
private readonly MyOptions _options; public HomeController(IOptions<MyOptions> options) { _options = options.Value; }
private readonly MyOptions _options; public HomeController(IOptionsSnapshot<MyOptions> options) { _options = options.Value; }
private readonly IOptionsMonitor<MyOptions> _options; public HomeController(IOptionsMonitor<MyOptions> options) { _options = options; }
命名选项
命名选项使用在当多个配置节绑定到同一属性时,并且区分大小写。
如以下的配置项:
"MyKey": { "Name": "my name is tom", "Age": "my age is 13" }, "MyKey1": { "Name": "my name is tom", "Age": "my age is 13" }
使用下面的类,通过两个属性区分键:
public class MyOptions { public const string Position = "MyKey"; public const string Position1 = "MyKey1"; public string Name { get; set; } public string Age { get; set; } }
然后配置命名选项:
services.Configure<MyOptions>(MyOptions.Position, Configuration.GetSection(MyOptions.Position));
services.Configure<MyOptions>(MyOptions.Position1, Configuration.GetSection(MyOptions.Position1));
最后使用命名选项:
private readonly MyOptions _options; private readonly MyOptions _options1;
public HomeController(IOptionsMonitor<MyOptions> options) { _options = options.Get(MyOptions.Position); _options1 = options.Get(MyOptions.Position1); }