我正在为
net6.0
及更高版本编写自定义配置提供程序,扩展 Microsoft.Extensions.Configuration.ConfigurationProvider
。我已经实现了 Load()
方法(调用远程源,标记化配置键值并将字典保存到 Data
属性) - 非常简单的实现。
现在我正在考虑改进实施以更好地支持
IOptionsMonitor<T>
和IOptionsSnapshot<T>
,但我找不到任何详细描述这一点的文档。我的配置源不支持推送机制,所以我能做的最好的就是轮询。 (虽然付出更大的努力,推也能实现)
有像
GetReloadToken
和 OnReload
这样的方法,但我很难理解这些方法的调用者以及选项的生命周期(分别是其配置源)。
这一切是如何运作的?可重载配置源的流程是怎样的?
internal sealed class MyLittleConfigurationProvider : ConfigurationProvider
{
private readonly ConfigFetcher _configFetcher;
public MyLittleConfigurationProvider(IDataClient client)
{
_configFetcher= new SecretsFetcher(client);
}
public override void Load()
{
var config = _configFetcher.GetConfig().GetAwaiter().GetResult();
var data = // turn config to dictionary
Data = data;
}
}
您可以像下面一样使用
IOptionsMonitor
。如果您修改appsettings.json
中的设置,它将检测到更改。
public class FileLoggerProvider : LoggerProviderBase
{
protected FileLoggerOptions? Options;
public FileLoggerProvider(IOptionsMonitor<FileLoggerOptions> options) : this(options.CurrentValue)
{
SettingsChangeToken = options.OnChange(opt => { Options = opt; });
}
public FileLoggerProvider(FileLoggerOptions options)
{
Options = options;
Interval = GetInterval(options.Interval);
Start();
}
/// <inheritdoc />
protected override QueueWriterBase CreateQueueWriter()
{
var filenamePattern = Options?.Path ?? "log-{yyyyMMdd}.txt";
var logPath = filenamePattern.FormatWithDate(DateTimeKind.Utc);
logPath = Path.GetFullPath(logPath);
return new FileQueueWriter(logPath);
}
}
请检查此线程中的存储库,其中有详细的代码。它有一些问题我已经解决了,你还需要检查我的答案。然后你就会知道如何使用它。