繁体   English   中英

基于app.config值的不同app.config appSettings

[英]Different app.config appSettings based on app.config value

我有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>

所以我想如果Condition == A定义一组属性,如果Condition == B - 不同的属性集,所以当我在A和BI之间切换时,不需要更改所有其他属性。 可能吗?

如果每个“条件”(环境可能是?)的属性名称相同,那么您可以使用一点编码技巧来完成此操作:

(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键的值切换要使用的键/值集。

我决定这样来。 自定义部分:

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>

如果我只能删除“公共KeyValueConfigurationCollection Opt1”属性 - 它对我来说是完美的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM