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

时间:2015-04-13 14:52:19

标签: asp.net-core

如何在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"]返回null。相反,ConfigurationManager.ConnectionStrings仅包含machine.config默认值。

2 个答案:

答案 0 :(得分:2)

他们似乎决定弃用System.Configuration。 所以我猜想(如果你是一个从web / exe.config读取一些配置的lib(通过ConfigurationManager)那么你必须拿出自己的配置语法,从中读取它json / xml / Startup中的任何内容,并通过它自己的api初始化lib。这有点颠倒了控制。

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

答案 1 :(得分:2)

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

我认为这不是一个令人满意的答案(它更像是一种解决方法),并且如果他们有更好的解决方案,我愿意接受别人的答案。

在您的配置文件正确无误之前,只需访问应用中的某个地方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);
    }
}