问题描述
在我的asp.net core 3.1项目中,我设置了一个自定义的sql提供程序,它运行良好。在我的启动中,我只想将sqlConfigurationProvider中的值加载到单独的字典中,以在整个应用程序中使用。我可以看到配置对象包含下面的屏幕截图所示的提供程序集合。但是,我找不到仅访问sqlConfigurationProvider并获取后续值的方法。这可能吗?
解决方法
根据您的描述,建议您首先使用Configuration.Providers来获取SQLConfigurationProvider。
但是ConfigurationProvider的data属性是受保护的,因此我们应该编写一个扩展方法来获取该值并将其设置到目录中。
更多详细信息,您可以参考以下代码:
创建扩展类:
public static class ConfigurationProviderExtensions
{
public static HashSet<string> GetFullKeyNames(this IConfigurationProvider provider,string rootKey,HashSet<string> initialKeys)
{
foreach (var key in provider.GetChildKeys(Enumerable.Empty<string>(),rootKey))
{
string surrogateKey = key;
if (rootKey != null)
{
surrogateKey = rootKey + ":" + key;
}
GetFullKeyNames(provider,surrogateKey,initialKeys);
if (!initialKeys.Any(k => k.StartsWith(surrogateKey)))
{
initialKeys.Add(surrogateKey);
}
}
return initialKeys;
}
}
然后,您可以添加以下代码以获取提供程序并获取值。
// Replace the EnvironmentVariablesConfigurationProvider to your provider
var re = ((ConfigurationRoot)Configuration).Providers.FirstOrDefault(x=>x.GetType() == typeof(EnvironmentVariablesConfigurationProvider));
var directory = new Dictionary<string,string>();
foreach (var key in re.GetFullKeyNames( null,new HashSet<string>()).OrderBy(p => p))
{
if (re.TryGet(key,out var value))
{
directory.Add(key,value);
}
}
结果: