如何在ASP.NET Core启动中访问配置提供程序值

问题描述

在我的asp.net core 3.1项目中,我设置了一个自定义sql提供程序,它运行良好。在我的启动中,我只想将sqlConfigurationProvider中的值加载到单独的字典中,以在整个应用程序中使用。我可以看到配置对象包含下面的屏幕截图所示的提供程序集合。但是,我找不到仅访问sqlConfigurationProvider并获取后续值的方法。这可能吗?

enter image description here

解决方法

根据您的描述,建议您首先使用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);
             }
        }

结果:

enter image description here