基于 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作用区别

为 3 个不同的环境转换 app.config

flask配置详解

Windows 服务安装程序未读取 App.Config 文件

如何部署不同的 App.config 值(使用 WiX)

基于Debug模式windows应用程序app.config设置