ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-04-05 13:00:21  阅读:199  来源: 互联网

标签:选项 Core ASP -- 配置 public services Configuration MyOption


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

 

 

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

标签:选项,Core,ASP,--,配置,public,services,Configuration,MyOption
来源: https://www.cnblogs.com/hobelee/p/16101954.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有