我试图通过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
属性的值?或者,是否可以将默认配置重新定义为在运行时定义的新配置文件 ,希望能够产生所需的最终结果?
答案 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
属性的预期用途。