<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Configuration

      視頻講解

      package說明

      Microsoft.Extensions.Configuration.Abstractions:抽象包,一大堆的接口

      Microsoft.Extensions.Configuration.Binder:提供一大堆的擴展,比如類型轉換

      Microsoft.Extensions.Configuration.Json:json實現

      Microsoft.Extensions.Configuration.CommandLine:命令行實現

      Microsoft.Extensions.Configuration.EnvironmentVariables:環境變量實現

      Microsoft.Extensions.Primitives:ChangeToken

      基本使用

      //創建配置管理器
      ConfigurationManager configuration = new ConfigurationManager();
      configuration.SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("config.json")//添加json文件
          .AddEnvironmentVariables();//添加系統環境變量
      //打印環境變量
      Console.WriteLine(configuration.GetSection("path").Value);
      //讀取josn
      var student = configuration.GetSection("student");
      Console.WriteLine(student["name"]);
      Console.WriteLine(configuration["student:name"]);
      //類型轉換:需要安裝Microsoft.Extensions.Configuration.Binder支持
      Console.WriteLine(configuration.GetSection("student:age").Get<int>());
      
      

      自定義

      IConfigurationProvider:表示我們的配置的數據源,可以是任意形式具體由自己實現,但是你必須處理成key-value的形式。

      IConfigurationSource:用于配置和構建IConfigurationProvider的派生類型

      //配置提供器選項:用于提供配置選項
      public class IsonConfigurationSource : IConfigurationSource
      {
          public string? Url { get; set; }
          public bool ReloadOnChange { get; set; }
      
          public IsonConfigurationSource()
          {
      
          }
      
          public IsonConfigurationSource(string url)
          {
              Url = url;
          }
      
          public IConfigurationProvider Build(IConfigurationBuilder builder)
          {
              if (Url == null)
              {
                  throw new ArgumentNullException(nameof(Url));
              }
              return new IsonConfigurationProvider(this);
          }
      }
      //配置提供器:配置源邏輯
      public class IsonConfigurationProvider : IConfigurationProvider
      {
          private ConcurrentDictionary<string, string> values = new ConcurrentDictionary<string, string>();
          private IsonConfigurationSource options;
          private CancellationTokenSource? tokenSource;
          public IsonConfigurationProvider(IsonConfigurationSource options)
          {
              this.options = options;
              //如果需要監聽
              if (this.options.ReloadOnChange)
              {
                  Watch();
              }
          }
          private void Watch()
          {
              //注冊事件
              ChangeToken.OnChange(GetReloadToken, () =>
              {
                  Load();
      
              });
              //模擬更改
              var t = new Thread(() =>
              {
      
                  while (true)
                  {
                      var token = tokenSource;
                      tokenSource = null;
                      //每3s之后發生更改
                      Thread.Sleep(3000);
                      //觸發事件,觸發之前一定要將tokenSource設置成null
                      token!.Cancel();
                  }
              });
              t.Start();
          }
          public IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath)
          {
              return values.Keys;
          }
      
          public IChangeToken GetReloadToken()
          {
              lock (this)
              {
                  if (tokenSource == null)
                  {
                      tokenSource = new CancellationTokenSource();
                  }
                  return new CancellationChangeToken(tokenSource!.Token);
              }
          }
      
          public void Load()
          {
              //假設我們從第三方地址獲取
              //var client = new HttpClient();
              //var response = client.GetAsync(source.Url).GetAwaiter().GetResult();
              //var json = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
              values.TryAdd("t1", "1111111");
              values.TryAdd("t2", "2222222");
              Console.WriteLine("ison文件已加載...");
          }
      
          public void Set(string key, string value)
          {
              values.TryAdd(key, value);
          }
      
          public bool TryGet(string key, out string value)
          {
              var flag = values.TryGetValue(key, out string? data);
              value = data ?? string.Empty;
              return flag;
          }
      }
      
      
      //擴展IConfigurationBuilder
      public static class IsonConfigurationExtensions
      {
          public static IConfigurationBuilder AddJsonUrl(this IConfigurationBuilder builder, string url)
          {
              if (builder == null)
              {
                  throw new ArgumentNullException(nameof(builder));
              }
              if (string.IsNullOrEmpty(url))
              {
                  throw new ArgumentException(nameof(url));
              }
      
              return builder.Add(new IsonConfigurationSource(url));
          }
      
          public static IConfigurationBuilder AddJsonUrl(this IConfigurationBuilder builder, Action<IsonConfigurationSource> configure)
          {
              if (builder == null)
              {
                  throw new ArgumentNullException(nameof(builder));
              }
      
              var source = new IsonConfigurationSource();
              configure(source);//執行用戶配置
              return builder.Add(source);
          }
      
      
      

      ChangeToken

      ChangeToken:將changeToken生產者和changeToken消費者進行綁定。

      IChangeToken:傳播已發生更改的通知(也可以自己實現)。可以注冊回調在事件發生時執行。

      CancellationChangeToken:IChangeToken的一種實現,通過取消令牌來進行通知。

      CancellationTokenSource:通知CancellationToken,告知其應被取消,執行回調。

      internal class Program
      {
          static void Main(string[] args)
          {
              var provider = new FileConfigurationProvider();
              //綁定
              provider.Watch();
              new TaskCompletionSource().Task.Wait();
          }
      }
      
      /// <summary>
      /// 文件配置程序超類
      /// </summary>
      public class FileConfigurationProvider
      {
          private CancellationTokenSource? tokenSource;
      
          public void Load()
          {
              Console.WriteLine($"[{DateTime.Now}]文件已加載...");
          }
      
          public void Watch()
          {
              //將changeToken生產者和changeToken消費者進行綁定(訂閱)
              ChangeToken.OnChange(GetReloadToken, Load);
              //觸發Change事件,通知更新
              var t = new Thread(() =>
              {
                  while (true)
                  {
                      Thread.Sleep(3000);
                      var t = tokenSource;
                      tokenSource = null;
                      //注意,取消之前一定要將tokenSource設置成null,不然會引發堆棧異常
                      //因為通知了取消,就會獲取changeChange,但是你沒有設置成null,OnChange認為又發生了取消通知
                      //會一直循環
                      t!.Cancel();//執行回調,發布取消事件。
                  }
              });
              t.Start();
          }
      
          /// <summary>
          /// 更新令牌,通過該令牌可以注冊回調,用于執行更新通知。
          /// </summary>
          /// <returns></returns>
          public IChangeToken GetReloadToken()
          {
              lock (this)
              {
                  //如果被消費就創建一個新的
                  if (tokenSource == null)
                  {
                      tokenSource = new CancellationTokenSource();
                  }
                  return new CancellationChangeToken(tokenSource.Token);
              }
          }
      
      }
      
      
      posted on 2023-02-14 14:34  花間島  閱讀(229)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 欧美日本激情| 91精品国产色综合久久| 五月丁香综合缴情六月小说| 少妇粗大进出白浆嘿嘿视频| 国产色视频网站免费| 成人动漫综合网| 亚洲国产精品久久无人区| 久久人人97超碰国产精品| 女同性恋一区二区三区视频| 中文无码乱人伦中文视频在线| 娇小萝被两个黑人用半米长| 亚洲国产精品线观看不卡| 日韩中文字幕国产精品| 米脂县| 麻豆蜜桃伦理一区二区三区| 欧美国产日产一区二区| 一区二区三区鲁丝不卡| 精品亚洲一区二区三区四区 | 广西| 亚洲 日韩 国产 制服 在线| 亚洲国产高清av网站| 国产美女在线精品免费观看| 2020年最新国产精品正在播放 | 男人用嘴添女人下身免费视频| 亚洲中文字幕无码久久2020| 国产综合色精品一区二区三区| 99久re热视频这里只有精品6| 日韩精品一区二区三区中文无码| 性无码专区无码| 国产精品一二三区蜜臀av| 国产一区二区三区在线观看免费| 平潭县| 国产高清精品在线91| 免费午夜无码视频在线观看| 日本亚洲中文字幕不卡| 98日韩精品人妻一二区| 国产特级毛片aaaaaa毛片| 婷婷色香五月综合缴缴情香蕉| 亚洲国产精品高清线久久| 鲁丝一区鲁丝二区鲁丝三区| 18av千部影片|