其他分享
首页 > 其他分享> > .NetCore选项数据热更新

.NetCore选项数据热更新

作者:互联网

1. 关键类型

2. 场景

3. 通过代码更新选项

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

标签:选项,NetCore,IOptionsMonitor,更新,public,IServiceCollection,OrderService,services,op
来源: https://blog.csdn.net/hahahzzzzz/article/details/118915220