ASP.NET Core--选项模式(Options)

Posted on 2022-04-05 12:54  樱木007  阅读(563)  评论(0编辑  收藏  举报

1简单概述

  ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。net Core 项目有个appsettings.json文件,程序默认也是读取的这个文件,appsettings.json是一个配置文件

2选项的注入和使用

选项框架提供了一组Configure<TOptions>扩展方法来注入选项类,可以将配置段Section传入并与其绑定,其中选项类满足下面的条件:

(1)必须是非抽象类

(2)必须包含无参数的public的构造函数。

(3)默认绑定所有public设置了getset属性,可以通过设置privateset属性

(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;
        }
    }

 

Copyright © 2024 樱木007
Powered by .NET 9.0 on Kubernetes