1简单概述
ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。net Core 项目有个appsettings.json文件,程序默认也是读取的这个文件,appsettings.json是一个配置文件
2选项的注入和使用
选项框架提供了一组Configure<TOptions>扩展方法来注入选项类,可以将配置段Section传入并与其绑定,其中选项类满足下面的条件:
(1)必须是非抽象类
(2)必须包含无参数的public的构造函数。
(3)默认绑定所有public设置了get、set属性,可以通过设置private的set属性
(4)不会绑定字段
2.1 在Controller或除Startup的类中使用配置
appsettings.json文件
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "MyOption": { "Name": "hobelee", "Age": 33, "Address": "北京市海淀区西北旺镇" }, "AllowedHosts": "*" }
要在Controller中使用MyOption的配置方法
(1)建立与MyOption配置相同的类
public class MyOption { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } }
(2)Startup.cs的ConfigureServices中注入MyOption
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.Configure<MyOption>(Configuration.GetSection("MyOption")); services.AddControllers(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
(3)在通过构造函数将MyOption注入到Controller
IOptions 依赖命名空间:Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace OptionDemo.Controllers { [ApiController] public class ValuesController : ControllerBase { private readonly MyOption myOption; public ValuesController(IOptions<MyOption> options) { myOption = options.Value; } [HttpGet] [Route("values/getmyoption")] public string GetMyOption() { return myOption.Name; } } }
2.2 在Startup.cs的ConfigureServices的方法中使用配置
(1)可以使用Bind方法,bind方法有两个重载
public void ConfigureServices(IServiceCollection services) { services.Configure<MyOption>(Configuration.GetSection("MyOption")); MyOption myOption1 = new MyOption(); Configuration.GetSection("MyOption").Bind(myOption1); MyOption myOption2 = new MyOption(); Configuration.Bind("MyOption", myOption2); services.AddControllers(); }
(2)可以使用IConfiguration的Get方法
public void ConfigureServices(IServiceCollection services) { var myConfiguration = Configuration.GetSection("MyOption"); var myOption = myConfiguration.Get<MyOption>(); services.AddControllers(); }
3 选项的注入方式及其应用场景
3.1 IOptions<out TOptions>
(1)它的生命周期为单例模式,可以注入任意生命周期的服务中
(2)不支持配置变更跟踪
(3)不支持命名选项
(4)使用场景:仅初始化时一次读取,不关心配置变化的服务
3.2 IOptionsSnapshot<out TOptions>
(1)它的生命周期为Scope模式,可以注入生命周期为Scope的服务中
(2)每个Scope都会重新计算选项值,因此可以读取到最新的配置中
(3)支持命名选项
(4)使用场景:生命周期为Scope且期望在配置变更后使用新值的服务
3.3 IOptionsMonitor<out TOptions>
(1)它的生命周期为单例模式,可以注入任意生命周期的服务中
(2)它提供了配置变更通知的能力
(3)支持命名选项
(4)使用场景:生命周期为单例,并且关心配置变更的服务
4 使用命名选项
当我们需要在应用中对同一选项类的不同实例配置不同的值时,可以使用命名选项。在Configure<TOptions>时传入name参数,
为不同的配置实例指定名称,同时注入各自的配置段
public void ConfigureServices(IServiceCollection services) { services.Configure<MyOption>(Configuration.GetSection("MyOption")); services.Configure<MyOption>("myOption2",Configuration.GetSection("MyOption")); services.AddControllers(); }
[ApiController] public class ValuesController : ControllerBase { private readonly MyOption myOption1; private readonly MyOption myOption2; public ValuesController(IOptionsMonitor<MyOption> options) { myOption1 = options.CurrentValue; myOption2 = options.Get("myOption2"); } [HttpGet] [Route("values/getmyoption")] public string GetMyOption() { return myOption1.Name; } }