首页 > 编程语言 >02-《AspNetCore》-配置

02-《AspNetCore》-配置

时间:2023-02-14 14:47:33浏览次数:46  
标签:02 tokenSource string AspNetCore 配置 var new null public

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

}

标签:02,tokenSource,string,AspNetCore,配置,var,new,null,public
From: https://www.cnblogs.com/chaeyeon/p/17119507.html

相关文章

  • 3.通用配置
    ......
  • 2023年使用centos发报警邮件配置
    环境:阿里云上ecs主机  centos7.6系统目的:监控nginx有访问异常ip,发送邮件通知安装软件:  yuminstall-ysendmailmailx  #mailx一般阿里云上都给安装了的......
  • WC2023(授课与讨论6)
    Fliper(3)将每个挡板拆成两个点(表示两面)并建图,即可求出所有环建立一张新图,以每个环作为点,并额外建立一个点\(z\)表示不在环中将每个挡板两点所在环连边,即对边染色使(除\(......
  • 倒带ChunJun,同心前行|2022年度回顾&2023年共建规划
    ChunJun是一个开始于2018年的批流一体数据集成框架项目,原名FlinkX。2022年2月22日,在FlinkX进行初版开源的整整四年后,技术团队决定对FlinkX进行整体升级,并更名为ChunJun,希望......
  • 2022.2.14 每日十题
    一个组织正在采用敏捷的思维方式。在第一个敏捷项目中,项目经理面临一个问题,因为团队不能及时做出决定。项目经理应该怎么做来解决这个问题?A.为新的组织政策下的决策制定......
  • 什么是文件配置
    已知的东西.YAML.JSON(JavaScriptObjectNotation).INI.XMLWeb应用会产生很多数据,这些数据需要经过服务器被传输到客户端这些数据常以文本形式构成,那么让这些数据格式化......
  • 对象存储服务MinIO安装,编写Starter整合,及永久链接配置
    (目录)对象存储服务MinIO1MinIO简介MinIO基于ApacheLicensev2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,......
  • 3602、int*int,long*long,都可能溢出
    packagetest.leecode.math;importjava.math.BigInteger;/***int*int,long*long,都可能溢出*@[email protected]**2022-3-18*/publicclassIntMultiplyInt......
  • 学习crack-day02
    简单的注册机练习分析:解析之前先查壳,再运行做好分析。这是一个无壳的三十二位的程序,之后我们再运行一下看有没有什么提示性字符。由于程序是用很老的VB5.0编写的,所以没......
  • 巨杉数据库荣获2022年度21世纪全国创新公司50强殊荣
    巨杉数据库凭借在数据库以及金融科技领域的持续技术深耕以及赋能数字化转型的突出表现,成功入选由南方财经全媒体集团主办的“21世纪(全国)创新公司50强:MIC50”榜单。近期,21......