asp.net-core - 如何在 asp.net core 启动中访问配置提供程序值
问题描述
在我的 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);
}
}
结果: