首页 > 其他分享 >net core自定义 Configuration Provider

net core自定义 Configuration Provider

时间:2024-08-29 10:41:00浏览次数:11  
标签:选项 core 自定义 filePath 配置 private options net public

创建CustomConfigurationProvider

首先,我们需要创建一个自定义的 ConfigurationSource 和 ConfigurationProvider 来支持配置文件的读取和监控。

public class CustomConfigurationSource : IConfigurationSource
{
    public string FilePath { get; }

    public CustomConfigurationSource(string filePath)
    {
        FilePath = filePath;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new CustomConfigurationProvider(this);
    }
}

public class CustomConfigurationProvider : ConfigurationProvider, IDisposable
{
    private readonly string _filePath;
    private FileSystemWatcher _fileWatcher;

    public CustomConfigurationProvider(CustomConfigurationSource source)
    {
        _filePath = source.FilePath;
        Load();

        _fileWatcher = new FileSystemWatcher(Path.GetDirectoryName(_filePath))
        {
            Filter = Path.GetFileName(_filePath),
            NotifyFilter = NotifyFilters.LastWrite
        };
        _fileWatcher.Changed += OnChanged;
        _fileWatcher.EnableRaisingEvents = true;
    }

    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        Load();
        OnReload(); // 通知配置系统已更新
    }

    public override void Load()
    {
        // 加载配置数据
        Data = JsonConfigurationFileParser.Parse(File.ReadAllText(_filePath));
    }

    public void Dispose()
    {
        _fileWatcher?.Dispose();
    }
}

public class CustomConfigurationProvider : ConfigurationProvider
{
    private readonly string _filePath;

    public CustomConfigurationProvider(string filePath)
    {
        _filePath = filePath;
    }

    public override void Load()
    {
        // Load configuration data from the file
        Data = LoadConfigurationFromFile(_filePath);
    }

    private IDictionary<string, string> LoadConfigurationFromFile(string filePath)
    {
        // Implement logic to load data from the file
        var data = new Dictionary<string, string>();
        // Example: data["Key"] = "Value";
        return data;
    }
}

创建 Background Service

public class ConfigurationUpdateService : BackgroundService
{
    private readonly IConfigurationRoot _configurationRoot;
    private readonly TimeSpan _updateInterval = TimeSpan.FromMinutes(5);

    public ConfigurationUpdateService(IConfigurationRoot configurationRoot)
    {
        _configurationRoot = configurationRoot;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // Check for updates and reload the configuration if needed
            ReloadConfigurationIfChanged();

            // Wait for the next check
            await Task.Delay(_updateInterval, stoppingToken);
        }
    }

    private void ReloadConfigurationIfChanged()
    {
        // Assuming the custom provider is used
        var customProvider = _configurationRoot.Providers
            .OfType<CustomConfigurationProvider>()
            .FirstOrDefault();

        if (customProvider != null)
        {
            customProvider.Load();
            customProvider.OnReload();
        }
    }
}

注册服务和配置 在program.cs里面

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Register the custom configuration source
        builder.Configuration.Add(new CustomConfigurationSource("path/to/config.json"));

        // Register the background service
        builder.Services.AddHostedService<ConfigurationUpdateService>();

        var app = builder.Build();

        app.Run();
    }
}

配置重新加载:当后台服务检测到更改时,它会在提供程序上调用 Load() 以刷新数据,然后触发 OnReload() 以通知配置系统。

使用IOptionsMonitor

public class MyOptions
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}
{
  "MyOptions": {
    "Setting1": "Value1",
    "Setting2": 42
  }
}

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Register options and bind them to configuration section
        builder.Services.Configure<MyOptions>(builder.Configuration.GetSection("MyOptions"));

        var app = builder.Build();

        app.Run();
    }
}


public class MyService
{
    private readonly IOptionsMonitor<MyOptions> _optionsMonitor;

    public MyService(IOptionsMonitor<MyOptions> optionsMonitor)
    {
        _optionsMonitor = optionsMonitor;

        // Subscribe to changes
        _optionsMonitor.OnChange(OnOptionsChanged);

        // Access the current value
        var currentOptions = _optionsMonitor.CurrentValue;
        Console.WriteLine($"Initial Setting1: {currentOptions.Setting1}");
        Console.WriteLine($"Initial Setting2: {currentOptions.Setting2}");
    }

    private void OnOptionsChanged(MyOptions options)
    {
        // This method is called whenever the options change
        Console.WriteLine($"Updated Setting1: {options.Setting1}");
        Console.WriteLine($"Updated Setting2: {options.Setting2}");
    }
}

  1. IOptions
    用途: 提供一种简单的方式来访问应用程序的配置选项,适合那些配置在应用程序生命周期内不会改变的场景。

特点:

IOptions 仅提供配置选项的一个单一快照(snapshot)。
配置选项在应用启动时加载,并在应用运行期间保持不变。
示例:

Copy code
public class MyService
{
    private readonly MyOptions _options;

    public MyService(IOptions<MyOptions> options)
    {
        _options = options.Value;
        Console.WriteLine($"Setting1: {_options.Setting1}");
        Console.WriteLine($"Setting2: {_options.Setting2}");
    }
}
  1. IOptionsSnapshot
    用途: 提供一次性(per-request)的配置选项快照,通常用于需要在每个请求中读取当前配置状态的场景。

特点:

适用于基于依赖注入的作用域,例如在 ASP.NET Core 中每个 HTTP 请求期间的配置。
在每个请求的生命周期内,可以获取配置的最新值。
示例:

public class MyService
{
    private readonly MyOptions _options;

    public MyService(IOptionsSnapshot<MyOptions> options)
    {
        _options = options.Value;
        Console.WriteLine($"Setting1: {_options.Setting1}");
        Console.WriteLine($"Setting2: {_options.Setting2}");
    }
}

使用 IOptionsSnapshot 会在每次请求期间重新计算并获取配置值。
3. IOptionsFactory
用途: 负责创建 T 类型的选项实例。通常不直接使用,而是由框架在内部使用来创建选项实例。

特点:

可以通过自定义 IOptionsFactory 来控制如何创建配置选项对象。
示例:

大多数情况下,不需要直接使用或实现 IOptionsFactory,因为它通常是由 IOptions 或 IOptionsSnapshot 自动处理的。
4. IOptionsValidator
用途: 用于验证配置选项是否符合某些规则或要求。可以在选项加载后自动验证其有效性。

特点:

允许你在选项初始化时进行验证,并抛出异常或生成错误消息。
示例:

可以自定义实现 IOptionsValidator 并注册到服务中,以确保选项在应用启动时是有效的。
5. IOptionsChangeTokenSource
用途: 提供一个 IChangeToken,用于检测配置变化。

特点:

与 IOptionsMonitor 一起使用,帮助监视配置源的更改。
示例:

通常在自定义配置源中使用,以便在配置数据发生变化时,触发 IOptionsMonitor 的重新加载。
6. IOptionsMonitorCache
用途: 管理 IOptionsMonitor 的缓存。允许你自定义选项的缓存行为。

特点:

提供一种方法来清除缓存并强制重新加载选项。
示例:

在某些场景下,你可能需要手动清除缓存,以便获取最新的配置数据。
什么时候选择使用哪个类型?
IOptions: 适用于配置在应用程序生命周期内不需要改变的场景。
IOptionsSnapshot: 适用于每个请求可能需要不同配置快照的场景(通常在 ASP.NET Core Web 应用中使用)。
IOptionsMonitor: 适用于需要实时监控配置变化,并动态响应的场景。
IOptionsFactory 和 IOptionsMonitorCache: 适用于需要自定义配置选项创建或缓存行为的高级场景。
这些选项机制使得 .NET Core 的配置系统非常灵活,可以满足从简单到复杂的配置需求。

标签:选项,core,自定义,filePath,配置,private,options,net,public
From: https://www.cnblogs.com/JosenEarth/p/18386098

相关文章

  • No module named 'mininet.cli'报错处理
    Nomodulenamed'mininet.cli'报错处理问题描述在命令行中输入python,在解释器中执行frommininet.cliimportCLI不会报错的前提下,使用makerun编译运行程序时,出现如下报错:Traceback(mostrecentcalllast):File"../../utils/run_exercise.py",line29,in<module>......
  • Mono 现状与未来:从Wine-mono 到.NET 9
    Mono官网主页[1]和MonoGitHub页面今日发布公告[2],微软宣布将Mono项目移交给WineHQ组织,也就是Linux兼容Windows应用框架Wine的开发团队。微软从2014年开始向.NET开源发展,当时微软宣布.NETCore即将开源[3]。然而,在此之前,.NET就已经有了一个名为Mono的开源计划......
  • 网络防火墙之自定义chain
    网络防火墙自定义链链管理:-N:new,自定义一条新的规则链-X:delete,删除自定义的空的规则链-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受DROP:丢弃-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除 ......
  • 记录荒废了三年的四年.net开发的第三次面试,苏州斯莱克
    现在就业的确崩了这次面试的时间是8月28号。距离上一次面试已经过去了一个月了,距离开始找工作已经过去了2个月。没多少找工作经验的我也体会到了什么叫就业崩了。看了一线码农的采访计划后,我也把苏州列为了找工作的地方之一。我成都感觉公司都翻烂了要么工资高,15000,但要求开发......
  • .NET 8 高并发微服务电商系统实战
    目录前言项目介绍1、核心功能2、优势特点功能介绍技术架构1、后端技术2、前端框架部署架构开发环境项目结构项目效果1、登录页面2、系统首页3、后台管理4、商品管理5、移动端效果项目地址总结最后前言嗨,大家好!推荐一个基于.NET8的高并发微服务电......
  • Java-List结合ComableFuture自定义线程池的工具类
    为了结合CompletableFuture处理列表中的数据,并利用自定义线程池来并行处理这些元素,我们可以创建一个工具类ListCompletableFutureUtil,它包含一个静态方法processListConcurrently,该方法接收一个列表、一个处理每个元素的函数以及一个自定义线程池,并利用CompletableFutur......
  • 洛雪音乐限定复活 - 自定义音源
    洛雪音乐之前因为被发了绿师函所以软件本身不再提供各大平台的接口,但是保留了自定义音源的功能,目前还能支持播放缓存下载功能。感谢sixyin为广大网友做出的贡献。下面简单介绍一下使用方法:Step1准备文件下载并安装洛雪音乐(lx-music-desktop)[官方页面]|[下载链接]下......
  • go 结构体切片自定义排序
    常见类型的默认实现gosort包默认支持int(sort.Ints(x[]int))、float64s(sort.Float64s(x[]float64))、string(sort.Strings(x[]string))从小到大排序,反序使用类似于sort.Sort(sort.Reverse(sort.Ints(x[]int)))的方式。结构体切片的自定义实现packagemainimport( "fmt" "s......
  • 一个.NET开源、免费的跨平台物联网网关
    前言今天大姚给大家分享一个基于.NET开源、免费的跨平台物联网网关:IoTGateway。项目介绍IoTGateway是一个基于.NET6的跨平台物联网网关。通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、扫码枪、CNC、数据库、串口设备、上位机、OPCServer、OPCUAServer、MqttServer......
  • ASP.NET Core 入门教程三 结合 EFCore 和 SQLite
    ASP.NETCore是一个开源的Web框架,它允许开发者轻松地构建现代、高性能的Web应用程序。EntityFrameworkCore(EFCore)是一个轻量级、可扩展的ORM(对象关系映射)框架,它支持多种数据库。SQLite是一个轻量级的嵌入式数据库,适用于小型应用程序。在本篇文章中,我们将学习如何......