如何提供可通过 asp.net 5 中的 ConfigurationManager 访问的设置?

How can I provide settings that can be accessed through ConfigurationManager in asp.net 5?

如何在 asp.net 5 中提供可通过 ConfigurationManager 访问的设置?

我使用的是不支持新 Microsoft.Framework.ConfigurationModel 的旧软件包,并且正在寻找 ConfigurationManager 来获取连接字符串、应用程序设置,甚至配置部分。向项目添加 app.config 似乎没有任何效果。

例如,app.config:

<configuration>
  <connectionStrings>
    <add name="logging" connectionString="Server=.\SQLExpress;Database=logging;Trusted_Connection=True;"/>
  </connectionStrings>
</configuration>

ConfigurationManager.ConnectionStrings["logging"] returns 空。相反,ConfigurationManager.ConnectionStrings 仅包含 machine.config 默认值。

他们似乎决定完全弃用 System.Configuration。 所以假设(我猜)如果你是一个从 web/exe.config(通过 ConfigurationManager)读取一些配置的库,那么你将不得不想出自己的配置语法,阅读它来自 Startup 中的 json/xml/whatever 并通过它自己的 api 初始化库。这有点像控制反转。

我向团队询问了此 issue 中更清晰的文档。

目前,我使用了 this answer 中的 ResetConfigMechanism 和上面评论中提到的 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 设置的组合。

我觉得这个 answer(这更像是一种解决方法),如果其他人有更好的解决方案,我很乐意接受他们的回答。

在您需要正确的配置文件之前,只需访问您应用中的 ConfigurationFixture.Current 就可以了!

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Reflection;

public sealed class ConfigurationFixture
{
    public static ConfigurationFixture Current = new ConfigurationFixture();

    private ConfigurationFixture()
    {
        // Run at start
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App.config"));
        ResetConfigMechanism();
    }

    private static void ResetConfigMechanism()
    {
        typeof(ConfigurationManager)
            .GetField("s_initState", BindingFlags.NonPublic |
                                     BindingFlags.Static)
            .SetValue(null, 0);

        typeof(ConfigurationManager)
            .GetField("s_configSystem", BindingFlags.NonPublic |
                                        BindingFlags.Static)
            .SetValue(null, null);

        typeof(ConfigurationManager)
            .Assembly.GetTypes()
            .Where(x => x.FullName ==
                        "System.Configuration.ClientConfigPaths")
            .First()
            .GetField("s_current", BindingFlags.NonPublic |
                                   BindingFlags.Static)
            .SetValue(null, null);
    }
}