如何在 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);
             }
        }

结果: