14 | 自定义配置数据源:低成本实现定制化配置方案
扩展步骤
- 实现IConfigurationSource
- 实现IConfigurationProvider
- 实现AddXXX扩展方法
示例
新建控制台应用程序👉命名ConfigurationCustom
👉引入包Microsoft.Extensions.Configuration
👉新建三个类:MyConfigurationSource.cs
、MyConfigurationProvider.cs
、MyConfigurationBuilderExtensions.cs
首先,MyConfigurationSource.cs
继承接口IConfigurationSource
using Microsoft.Extensions.Configuration;
using System;
namespace ConfigurationCustom
{
public class MyConfigurationSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new MyConfigurationProvider();
}
}
}
MyConfigurationProvider.cs
没有直接继承IConfigurationProvider
而是继承了抽象类ConfigurationProvider
,这个类实际上是继承了IConfigurationProvider
using Microsoft.Extensions.Configuration;
using System;
using System.Timers;
namespace ConfigurationCustom
{
class MyConfigurationProvider : ConfigurationProvider
{
private readonly Timer _timer;
public MyConfigurationProvider() : base()
{
_timer = new Timer();
_timer.Elapsed += _timer_Elapsed;
_timer.Interval = 3000;
_timer.Start();
}
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Load(true);
}
// 重写基类方法加载数据
public override void Load()
{
Load(false);
}
// 入参表示我们这里是否是重新加载,如果重新加载,我们需要触发OnReload这个方法
private void Load(bool reload)
{
Data["lastTime"] = DateTime.Now.ToString();
if (reload)
{
OnReload();
}
}
}
}
我们继承了ConfigurationProvider
之后,键入一些代码,设置一个Timer
每3秒将当前时间给Provider
,来模拟配置发生变化。
修改Program
类
using Microsoft.Extensions.Configuration;
using System;
namespace ConfigurationCustom
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.Add(new MyConfigurationSource());
var root = builder.Build();
Console.WriteLine(root["lastTime"]);
}
}
}
输出:
但是我们这样子去分发我们的配置源的包的话,我们会需要把我们的MyConfigurationSource
定义为public
的,否则使用方式没办法引用到我们这个类的,那么我们就可以通过扩展方法的方法来保障我们不需要暴露我们的configSource
之前我们创建了类MyConfigurationBuilderExtensions
using ConfigurationCustom;
namespace Microsoft.Extensions.Configuration
{
public static class MyConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddMyConfiguration(this IConfigurationBuilder builder)
{
builder.Add(new MyConfigurationSource());
return builder;
}
}
}
首先我们把这个扩展方法的命名空间,放在了config的命名空间,这样方便我们在引用的时候直接使用。然后把其它两个类定义为internal
。如果分发到第三方的话,internal
的类是不能被引用的。
之后去使用的话,将Program
类的builder.Add(new MyConfigurationSource()
修改为builder.AddMyConfiguration()
using Microsoft.Extensions.Configuration;
using System;
namespace ConfigurationCustom
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.AddMyConfiguration();
var root = builder.Build();
Console.WriteLine(root["lastTime"]);
}
}
}
输出:
之前我们学到了要使用ChangeToken
的方式来监听配置变化,现在这里一样使用ChangeToken.OnChange
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;
using System;
namespace ConfigurationCustom
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.AddMyConfiguration();
var root = builder.Build();
ChangeToken.OnChange(() => root.GetReloadToken(), () =>
{
Console.WriteLine(root["lastTime"]);
});
Console.WriteLine("开始监听配置:");
Console.ReadKey();
}
}
}
输出:
本文作者:hiwwwk
本文链接:https://www.cnblogs.com/wwwk/p/15873376.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步