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


    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;
            }
        }
  • 相关阅读:
    linked-list-cycle-ii leetcode C++
    linked-list-cycle-ii leetcode C++
    binary-tree-maximum-path-sum leetcode C++
    0090 变量的概念,变量的使用:声明、赋值、初始化、语法扩展、命名规范
    0089 变量的概念
    0087 JavaScript注释,JavaScript输入输出语句
    0086 初识JavaScript:是什么、浏览器执行 JS(渲染引擎、解释引擎)、组成、初体验
    0085 计算机基础简介
    0084 编程语言简介
    0083 移动端WEB开发之响应式布局、bootstrap
  • 原文地址:https://www.cnblogs.com/hobelee/p/16101954.html
Copyright © 2020-2023  润新知