0
点赞
收藏
分享

微信扫一扫

.NET 5 自定义配置(动态配置,配置中心)


/// <summary>
/// 增加配置扩展
/// </summary>
public static class ConfigExtensions
{
/// <summary>
/// 自定义扩展,增加配置
/// </summary>
public static IConfigurationBuilder AddCustomConfig(this IConfigurationBuilder builder, IConfiguration configuration = null)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}

return builder.Add(new ConfigSource());
}
}

/// <summary>
/// 配置提供者
/// </summary>
public class ConfigProvider : ConfigurationProvider, IDisposable
{
private bool isDisposed = false;
public ConfigProvider()
{
ThreadPool.QueueUserWorkItem(obj =>
{
while (!isDisposed)
{
Load();
Thread.Sleep(3 * 1000);
}
});
}
/// <summary>
/// 读写锁
/// </summary>
private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();
public override IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath)
{
lockObj.EnterReadLock();
try
{
return base.GetChildKeys(earlierKeys, parentPath);
}
finally
{
lockObj.ExitReadLock();
}
}
public override bool TryGet(string key, out string value)
{
lockObj.EnterReadLock();
try
{
return base.TryGet(key, out value);
}
finally
{
lockObj.ExitReadLock();
}
}
/// <summary>
/// 更新数据
/// 内部数据结构: Name:asdfd:asdf:[0]
/// Name:asdfd:asdf:[1]
/// </summary>
public override void Load()
{
try
{
lockObj.EnterWriteLock();
Data["Name"] = DateTime.Now.ToString();
}
finally
{
lockObj.ExitWriteLock();
}
OnReload();
}
public void Dispose()
{
isDisposed = true;
}
}

/// <summary>
/// 配置源
/// </summary>
public class ConfigSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new ConfigProvider();
}
}

IConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");

var configFile = configBuilder.Build();
configBuilder.AddCustomConfig();
configFile = configBuilder.Build();

var serviceCollection = new ServiceCollection();

serviceCollection.Configure<MyOptions>(configFile);

var serviceProvider = serviceCollection.BuildServiceProvider();
var _options = serviceProvider.GetRequiredService<IOptionsMonitor<MyOptions>>();



_options.OnChange(_ => Console.WriteLine(_.Name));
// Task.Run(() => {
//=
// while (true)
// {
// Thread.Sleep(2000);
// Console.WriteLine(_options.CurrentValue.Name);
// }
// });
Console.WriteLine("获取到配置信息!");
Console.ReadLine();

举报

相关推荐

0 条评论