基于 app.config 值的不同 app.config appSettings
Posted
技术标签:
【中文标题】基于 app.config 值的不同 app.config appSettings【英文标题】:Different app.config appSettings based on app.config value 【发布时间】:2015-06-05 15:43:39 【问题描述】:我有 app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<!--One set of properties-->
<add key="Condition" value="A"/>
<add key="DependingPropertyA" value="B"/>
<add key="DependingPropertyB" value="C"/>
<!--Another set of properties-->
<add key="Condition" value="B"/>
<add key="DependingPropertyA" value="D"/>
<add key="DependingPropertyB" value="E"/>
</appSettings>
</configuration>
所以我想要 if Condition == A 定义一组属性,如果 Condition == B - 不同的一组属性,所以当我在 A 和 B 之间切换时,我不需要更改所有其他属性。 有可能吗?
【问题讨论】:
这是用于必须不同的调试和发布版本 没有。这不适用于调试/发布配置。 看看这个hanselman.com/blog/… 【参考方案1】:如果每个“条件”(可能是环境?)的属性名称都相同,那么您可以通过一些编码技巧来做到这一点:
(App.Config:)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<!--Condition 'selector', change value to 'CondB' when you want to switch-->
<add key="Condition" value="CondA"/>
<add key="CondA.DependingPropertyA" value="B"/>
<add key="CondA.DependingPropertyB" value="C"/>
<add key="CondB.DependingPropertyA" value="D"/>
<add key="CondB.DependingPropertyB" value="E"/>
</appSettings>
</configuration>
然后,假设在您的 C# .NET 代码中:
string keyPrepend = System.Configuration.ConfigurationManager.AppSettings["Condition"];
string propAValue = System.Configuration.ConfigurationManager.AppSettings[String.Format("0.1", keyPrepend, "DependingPropertyA")];
string propBValue = System.Configuration.ConfigurationManager.AppSettings[String.Format("0.1", keyPrepend, "DependingPropertyB")];
这让您可以根据单个 Condition 键的值来切换要使用的键/值集。
【讨论】:
是的,正在考虑这种方法,但我不喜欢它:(需要记住,对于某些属性,我们需要“特殊”名称,而对于某些我们不需要。 是的。我通常尝试将这些东西从核心代码中抽象出来,并将它们放入一个名为“ConfigManager.cs”的 Helper/Utility 类中。您可以为每个设置创建公共属性,并让每个设置知道如何从 App.Config 中读取自身。 (出于充分的理由(IoC,DI),我知道一些对 Helper 类的看法,但我发现它们对像这样的简单事情很有用。)无论如何,这可以保持你的主代码干净,调用“ConfigManager.PropertyA”,而不是乱扔垃圾AppSetting 到处调用,并且在后台 ConfigManager 控制知道从哪里/如何获取东西。 是的,当然它会被封装在某种 *Manager 类中。 我正在做一些非常相似的事情,但问题是第三方 SDK 要求其在 appSettings 中的键名完全匹配,并且我需要此键的两个不同值。【参考方案2】:我决定来这里。 自定义部分:
using System.Configuration;
namespace ConditionalConfig
public class ConditionalConfigurationSection : ConfigurationSection
[ConfigurationProperty("selector", IsRequired = true, IsDefaultCollection = true)]
public string Selector
get return (string) base["selector"];
set base["selector"] = value;
public new string this[string key]
get
var result = Shared[key] ?? ((KeyValueConfigurationCollection) base[Selector])[key];
return result != null ? result.Value : null;
[ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
public KeyValueConfigurationCollection Shared
get return (KeyValueConfigurationCollection) base[""];
[ConfigurationProperty("opt1", IsRequired = true)]
public KeyValueConfigurationCollection Opt1
get return (KeyValueConfigurationCollection) base["opt1"];
[ConfigurationProperty("opt2", IsRequired = true)]
public KeyValueConfigurationCollection Opt2
get return (KeyValueConfigurationCollection) base["opt2"];
app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="conditional" type="ConditionalConfig.ConditionalConfigurationSection, ConditionalConfig" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<conditional selector="opt2">
<add key="test" value="value"/>
<opt1>
<add key="test1" value="value1"/>
</opt1>
<opt2>
<add key="test1" value="value2"/>
</opt2>
</conditional>
</configuration>
如果我可以删除“public KeyValueConfigurationCollection Opt1”属性 - 这对我来说是完美的。
【讨论】:
以上是关于基于 app.config 值的不同 app.config appSettings的主要内容,如果未能解决你的问题,请参考以下文章
C#之app.configexe.config和vshost.exe.config作用区别