C# “System.Configuration.ConfigurationManager.ConnectionString”是否可以用非默认配置文件值更新?

C# “System.Configuration.ConfigurationManager.ConnectionString”是否可以用非默认配置文件值更新?,c#,.net,connection-string,configurationmanager,C#,.net,Connection String,Configurationmanager,我试图通过静态属性从运行时提供的任意配置文件访问一组连接字符串。应用程序代码希望连接字符串在此集合中,我需要在不编辑默认配置文件的情况下提供一个新值 我已确定可以使用从任意配置文件加载连接字符串,例如: 在此上下文中,我希望能够从static属性访问从some.config加载的连接字符串,但这似乎只包含应用程序配置默认值中可用的内容 是否可以屏蔽或复制到默认配置中以更新静态ConfigurationManager.ConnectionString属性的值?或者,是否有任何方法可以将默认配置重新

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

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

在此上下文中,我希望能够从static属性访问从some.config加载的连接字符串,但这似乎只包含应用程序配置默认值中可用的内容


是否可以屏蔽或复制到默认配置中以更新静态ConfigurationManager.ConnectionString属性的值?或者,是否有任何方法可以将默认配置重新定义为在运行时定义的新配置文件,从而有望获得所需的最终结果?

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

如果此配置已正确加载:

var config = ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap{ExeConfigFilename = 'some.config'}.
        ConfigurationUserLevel.None);
然后可以从那里获取连接字符串

var connectionString = config.ConnectionStrings.ConnectionStrings["connectionName"]
    .ConnectionString;

答案的一部分是不要在类的深处使用ConfigurationManager或Configuration。您可以使用依赖项注入,或者在最坏的情况下,创建自己的静态类来代替ConfigurationManager。但这是一个很好的例子,说明了为什么您不希望类直接访问它,因为您无法更改其行为。

一个有趣的反射解决方案,我允许通过使用反射更改的非公共。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属性的预期用途。

紧接着-ConfigurationManager.OpenMappedExconfiguration-检查config的HasFile属性。有时它会做一些坏事,比如即使没有加载文件也不会抛出异常。它将为您提供一个不包含文件中内容的配置对象。是的,HasFile属性为true,FilePath是带有我的连接字符串的非默认配置文件。您不能更改应用程序的设计,为您的连接、连接管理器或配置服务等使用专门的服务。当然,但我知道我能做到。我问这个问题是想看看在这种情况下,是否有我不熟悉的配置技巧可以发挥作用。我认为这不是他想要的。他希望将ConfigurationManager.ConnectionString映射为指向更动态的、在运行时设置的内容,至少这是我正在阅读的内容。如果我有机会更改此代码,并且知道我对.NET配置的了解,我将删除对ConfigurationManager静态集合的依赖。目前,我正在探索现有代码的替代方案。
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);