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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值