如何在 asp.net 核心启动中访问配置提供程序值
How to access configuration provider values in asp.net core startup
在我的 asp.net 核心 3.1 项目中,我设置了一个自定义 sql 提供程序,它运行良好。在我的 Startup 中,我只想将 SQLConfigurationProvider 中的值加载到一个单独的字典中,以便在我的整个应用程序中使用。我可以看到配置对象包含一个提供者集合,如下图所示。但是我找不到一种方法来只访问 SQLConfigurationProvider 并获取后续值。这可能吗?
根据你的描述,我建议你可以先使用Configuration.Providers获取SQLConfigurationProvider。
但是ConfigurationProvider的数据属性是受保护的,所以我们应该写一个扩展方法来获取值并将其设置到目录中。
更多详情,您可以参考以下代码:
创建扩展 class:
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);
}
}
结果:
在我的 asp.net 核心 3.1 项目中,我设置了一个自定义 sql 提供程序,它运行良好。在我的 Startup 中,我只想将 SQLConfigurationProvider 中的值加载到一个单独的字典中,以便在我的整个应用程序中使用。我可以看到配置对象包含一个提供者集合,如下图所示。但是我找不到一种方法来只访问 SQLConfigurationProvider 并获取后续值。这可能吗?
根据你的描述,我建议你可以先使用Configuration.Providers获取SQLConfigurationProvider。
但是ConfigurationProvider的数据属性是受保护的,所以我们应该写一个扩展方法来获取值并将其设置到目录中。
更多详情,您可以参考以下代码:
创建扩展 class:
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);
}
}
结果: