可以使用非默认配置文件值更新`System.Configuration.ConfigurationManager.ConnectionStrings`吗?

时间:2017-12-18 17:50:17

标签: c# .net connection-string configurationmanager

我试图通过ConfigurationManager.ConnectionStrings静态属性从运行时提供的任意配置文件中访问一组连接字符串。应用程序代码期望连接字符串在此集合中,我需要提供新值而不编辑默认配置文件。

我已确定可以使用System.Configuration.ConfigurationManager.OpenMappedExeConfiguration使用System.Configuration.ExeConfigurationFileMap从任意配置文件加载连接字符串,例如:

using System.Configuration;

var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap{ExeConfigFilename = 'some.config'}, ConfigurationUserLevel.None);

config.RefreshSection(config.ConnectionStrings.SectionInformation.SectionName);

在这种情况下,我希望能够从静态ConfigurationManager.ConnectionStrings属性访问从some.config加载的连接字符串,但这似乎仅包含应用程序配置默认值中可用的内容。

是否可以屏蔽或复制到默认配置以更新静态ConfigurationManager.ConnectionStrings属性的值?或者,是否可以将默认配置重新定义为在运行时定义的新配置文件 ,希望能够产生所需的最终结果?

2 个答案:

答案 0 :(得分:1)

简短的回答是否定的。 ConnectionStrings的{​​{1}}和AppSettings属性只是为了方便从默认配置中读取。您可以加载其他配置,但不能更改这些方法的行为。

如果正确加载ConfigurationManager

Configuration

然后你可以从那里获得连接字符串。

var config = ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap{ExeConfigFilename = 'some.config'}.
        ConfigurationUserLevel.None);

答案的一部分不是在您的课程深处使用var connectionString = config.ConnectionStrings.ConnectionStrings["connectionName"] .ConnectionString; ConfigurationManager。您可以使用依赖项注入,或者在最坏的情况下,创建自己的静态类而不是Configuration。但这是一个完美的例子,说明为什么你不希望一个类直接访问它,因为你无法改变它的行为。

答案 1 :(得分:0)

一个有趣的反思解决方法我discovered允许使用反射更改System.Configuration.ConfigurationElementCollection的非公开System.Configuration.ConfigurationManager.ConnectionStrings。bReadOnly属性:

using System;
using System.Configuration;

var connectionString = "...";
var connectionStringSetting = new ConnectionStringSettings("OrionDB", connectionString);
var field = ConfigurationElementCollection.GetField("bReadOnly",
    Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance);
var connectionStrings = ConfigurationManager.ConnectionStrings;
field.SetValue(connectionStrings, false);
connectionStrings.Add(connectionStringSetting);

这给了我理想的行为,但不一定是静态ConfigurationManager属性的预期用途。