• 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 【奋斗吧2018】风电检修工——荒原上的“听风者” 2019-08-31
  • 母亲节又送康乃馨?送这样的健康佳品才走心 2019-08-30
  • [酷]此文已经把马克思理论、边际理论、人类需求层次理论、生物学理论、心理学理论、社会管理学理论等理论在哲学层面完美融合了! 2019-08-26
  • 兰芝雪纱修颜气垫隔离霜 2019-07-27
  • “鹊桥”中继星顺利进入使命轨道运行 2019-07-27
  • 超越舆情管理的360度信息决策 2019-07-22
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-07-21
  • 防震减灾事业发展的重要理论成果 2019-07-20
  • 珠宝配美人!李冰冰大片衣着性感秀身段 2019-07-20
  • 机器人也能拥有“情商”?这个可以有 2019-07-19
  • 香港赛马会报名表:Asp.net core中实现自动更新的Option的方法示例

     更新时间:2019年03月14日 10:09:32   作者:zhouandke   我要评论
    这篇文章主要介绍了Asp.net core中实现自动更新的Option的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    香港赛马会网站惠泽社绝杀八码 www.mwcrz.tw Asp.net core可以监视json、xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper、consul获取最新的配置信息, 需要自己实现.

    阅读了 Asp.net core Document的Custom configuration provider, 得知只需要实现自己的IConfigurationSource和对应ConfigurationProvider即可

    在这个示例中, 我建立了一个简单的option, 只包含一个不断变化的计数器变量.

    public class RefreshableOptions
    {
      public int IncreasementCount { get; set; }
    }
    
    

    实现IConfigurationSource和对应ConfigurationProvider, 内部有一个timer模拟从外部获取了最新的数据, 这里为简单起见, 采用硬编码的方式指定了option的路径

    public class AutoRefreshConfigurationSource : IConfigurationSource
    {
      public IConfigurationProvider Build(IConfigurationBuilder builder)
      {
        return new AutoRefreshConfigurationProvider();
      }
    }
    
    public class AutoRefreshConfigurationProvider : ConfigurationProvider
    {
      private int count = 0;
      private bool isChanged;
    
      public AutoRefreshConfigurationProvider() : base()
      {
        Timer timer = new Timer(TimerCallback);
        timer.Change(1000, 3000);
      }
    
      public override void Load()
      {
        var beforeData = Data;
        // 这里采用硬编码指定option的路径
        Data = new Dictionary<string, string>() { { "AutoRefreshOptions:IncreasementCount", count.ToString() } };
        isChanged = IsDictionaryChanged(beforeData, Data);
      }
    
      private void TimerCallback(object state)
      {
        count++;
        this.Load();
        if (isChanged)
        {
          base.OnReload();//通知IConfiguration实例, 有参数发生了改变
          isChanged = false;
        }
      }
      //判断两个Idictionary是否有不同的帮助方法
      private static bool IsDictionaryChanged(IDictionary<string, string> before, IDictionary<string, string> after)
      {
        if (before == null && after == null)
        {
          return false;
        }
        if ((before == null) != (after == null))
        {
          return true;
        }
        if (before.Count != after.Count)
        {
          return true;
        }
        var ignoreCaseBefore = new Dictionary<string, string>(before, StringComparer.OrdinalIgnoreCase);
        foreach (var afterItemKey in after.Keys)
        {
          if (!ignoreCaseBefore.TryGetValue(afterItemKey, out var beforeItemValue))
          {
            return true;
          }
          if (beforeItemValue != after[afterItemKey])
          {
            return true;
          }
          ignoreCaseBefore.Remove(afterItemKey);
        }
        if (ignoreCaseBefore.Count > 0)
        {
          return true;
        }
        return false;
      }
    }

    实现扩展方法

    public static class AutoRereshConfigurationExtensions
    {
      public static IConfigurationBuilder AddAutoRereshConfiguration(this IConfigurationBuilder builder)
      {
        return builder.Add(new AutoRefreshConfigurationSource());
      }
    }
    
    

    使用方法

    新建一个WebApi项目, 在Program.CreateWebHostBuilder中增加黄色部分

    WebHost.CreateDefaultBuilder(args)
      .ConfigureAppConfiguration(config =>
      {
        config.AddAutoRereshConfiguration();
      })
      .UseStartup<Startup>();
    
    

    在Startup. ConfigureServices中配置

    services.Configure<RefreshableOptions>(Configuration.GetSection("AutoRefreshOptions"));

    修改ValuesController

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
      private RefreshableOptions refreshableOptions;
      public ValuesController(IOptionsSnapshot<RefreshableOptions> refreshableOptions)
      {
        this.refreshableOptions = refreshableOptions.Value;
      }
    
      [HttpGet]
      public ActionResult<IEnumerable<string>> Get()
      {
        return new string[] { "value1", "value2", refreshableOptions.IncreasementCount.ToString() };
      }
    }
    
    

    启动后不停的刷新//localhost:5000/api/values可以看到返回内容的变化

    本文代码

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:

    相关文章

    最新评论

  • 在庆祝海南建省办经济特区30周年大会上的讲话 2019-10-07
  • 俄罗斯世界杯F组:球迷风采 2019-09-24
  • 彭于晏廖凡曝姜文“精神洁癖” 2019-09-24
  • 苏州大学研究生支教团网上众筹资助留守儿童 2019-09-23
  • 湖北政务微信排行榜第187期出炉 交警类公号表现亮眼 2019-09-19
  • 【奋斗吧2018】风电检修工——荒原上的“听风者” 2019-08-31
  • 母亲节又送康乃馨?送这样的健康佳品才走心 2019-08-30
  • [酷]此文已经把马克思理论、边际理论、人类需求层次理论、生物学理论、心理学理论、社会管理学理论等理论在哲学层面完美融合了! 2019-08-26
  • 兰芝雪纱修颜气垫隔离霜 2019-07-27
  • “鹊桥”中继星顺利进入使命轨道运行 2019-07-27
  • 超越舆情管理的360度信息决策 2019-07-22
  • 视频陶然居变形记:从路边小饭馆到全国餐饮十强 2019-07-21
  • 防震减灾事业发展的重要理论成果 2019-07-20
  • 珠宝配美人!李冰冰大片衣着性感秀身段 2019-07-20
  • 机器人也能拥有“情商”?这个可以有 2019-07-19
  • 3d包串玩法 福彩3D一毒胆必出27注组选 赛车北京pk10稳计划 夺宝阁计划软件手机版下载 飞禽走兽怎么压分稳赚 2019年3d南方带线走势图 癸花宝典王中王三肖六码 冠通棋牌二人麻将 青蛙彩票36码大公开 三公大吃小玩法规则