.NetCore选项数据热更新

1. 关键类型

  • IOptionsMonitor<out TOptions>
  • IOptionsSnapshot<out TOptions>

2. 场景

  • 范围作用域类型(AddScoped)使用 IOptionsSnapshot
  • 单例服务(AddSingleton)使用 IOptionsMonitor

3. 通过代码更新选项

  • IPostConfigureOptions<TOptions>

4. IOptionsSnapshot热更新代码

    public interface IOrderService
    {
        int ShowMaxCount();
    }

    public class OrderService : IOrderService
    {
        IOptionsSnapshot<OrderServiceOptions> _options;

        public OrderService(IOptionsSnapshot<OrderServiceOptions> options)
        {
            this._options = options;
        }

        public int ShowMaxCount()
        {
            return _options.Value.MaxCount;
        }
    }

    public class OrderServiceOptions
    {
        public int MaxCount { get; set; } = 100;
    }
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<OrderServiceOptions>(Configuration.GetSection("OrderService"));
            services.AddScoped<IOrderService, OrderService>();

            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "NET_Core", Version = "v1" });
            });
        }

5. IOptionsMonitor热更新代码

    public interface IOrderService
    {
        int ShowMaxCount();
    }

    public class OrderService : IOrderService
    {
        IOptionsMonitor<OrderServiceOptions> _options;

        public OrderService(IOptionsMonitor<OrderServiceOptions> options)
        {
            this._options = options;
        }

        public int ShowMaxCount()
        {
            return _options.CurrentValue.MaxCount;
        }
    }

    public class OrderServiceOptions
    {
        public int MaxCount { get; set; } = 100;
    }
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<OrderServiceOptions>(Configuration.GetSection("OrderService"));
            services.AddSingleton<IOrderService, OrderService>();

            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "NET_Core", Version = "v1" });
            });
        }

6. IOptionsMonitor监听配置变化

备注1:IOptionsSnapshot不支持监听配置变化

备注2:核心代码如下,其余代码在原有基础不变

        public OrderService(IOptionsMonitor<OrderServiceOptions> options)
        {
            this._options = options;

            _options.OnChange(option =>
            {
                Console.WriteLine($"配置发生了变化:{option.MaxCount}");
            });
        }

7. 简化服务注册代码

把服务注册的代码,放在静态扩展方法中

namespace Microsoft.Extensions.DependencyInjection
{
    public static class OrderServiceExtensions
    {
        public static IServiceCollection AddOrderService(this IServiceCollection services,
            IConfiguration configuration)
        {
            services.Configure<OrderServiceOptions>(configuration);
            services.AddSingleton<IOrderService, OrderService>();
            return services;
        }
    }
}
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOrderService(Configuration.GetSection("OrderService"));

            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "NET_Core", Version = "v1" });
            });
        }

8. 动态配置

    public static class OrderServiceExtensions
    {
        public static IServiceCollection AddOrderService(this IServiceCollection services,
            IConfiguration configuration)
        {
            services.Configure<OrderServiceOptions>(configuration);
            //从配置文件读取后,还要再给他加100
            services.PostConfigure<OrderServiceOptions>(options =>
            {
                options.MaxCount += 100;
            });

            services.AddSingleton<IOrderService, OrderService>();
            return services;
        }
    }

上一篇:23种设计模式-java-代理


下一篇:设计模式轻松学之05 代理模式