代码之家  ›  专栏  ›  技术社区  ›  Dugan

为什么我的ConfigurationElement没有从app.config读取其值?

  •  2
  • Dugan  · 技术社区  · 15 年前

    我使用System.Configuration.ConfigurationElement来表示app.config中的一些数据。它正确地检测到节存在(如果节不存在,则抛出错误),但它从未正确填充。排队的时候我只能得到一个空的集合,睡觉的时候我只能得到500个。

    以下是相关的app.config部分:

    <serviceBroker sleepTime="1000"> 
      <queues>  
         <queue name="TestQueue" priority="1"/>
      </queues>
    </serviceBroker>
    

    这是完整的app.config

    <?xml version="1.0"?>
    <configuration>
        <configSections>
        <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,Castle.Windsor" />
        <section name="SAM.Configuration.Data" type="SAM.Configuration.Data.DataConfigurationSection, SAM.Configuration"/>
        <section name="NHibernate.Caches.MemCache" type="NHibernate.Caches.MemCache.MemCacheSectionHandler,NHibernate.Caches.MemCache" />
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    <castle/>
    <connectionStrings>
        <remove name="LocalSqlServer"/>
        <add name="LocalSqlServer" connectionString=""/>
        <add name="AuthSqlServer" connectionString=""/>
    </connectionStrings>
    <SAM.Configuration.Data>
        <mage MaxThreads="1" SmtpHost="qa" SmtpPort="25">
            <Tasks/>
        </mage>
        <serviceBroker sleepTime="1000">
            <queues>
                <queue name="TestQueue" priority="1"/>
            </queues>
        </serviceBroker>
        <databases>
            <database name="BusinessDomain" defaultConnectionName="">
                <connections>
                    <connection>
                        <add key="name" value=""/>
                        <add key="assembly" value="SAM.Data.NHibernateProvider"/>
                        <add key="type" value="SAM.Data.NHibernateProvider.RepositoryManager"/>
                        <add key="configurationFile" value="Business.NHibernateSession.Config"/>
                        <add key="isEncrypted" value="FALSE" />
                    </connection>
                    <connection>
                        <add key="name" value=""/>
                        <add key="assembly" value="SAM.Data.NHibernateProvider"/>
                        <add key="type" value="SAM.Data.NHibernateProvider.RepositoryManager"/>
                        <add key="configurationFile" value="Business.NHibernateSession.Config"/>
                        <add key="isEncrypted" value="FALSE" />
                    </connection>
                </connections>
            </database>
        </databases>
    </SAM.Configuration.Data>
    <NHibernate.Caches.MemCache configSource="nhibernate.memcache.config" />
    </configuration>
    

    这里是我的配置元素:

    public class ServiceBrokerConfigurationElement : ConfigurationElement,
    {
      [ConfigurationCollection(typeof(ServiceBrokerQueueElement), AddItemName = "queue")]
      [ConfigurationProperty("queues", IsRequired = true)]
      public ServiceBrokerQueueElementCollection Queues
      {
        get { return (ServiceBrokerQueueElementCollection)this["queues"]; }
      }
    
      [ConfigurationProperty("sleepTime", DefaultValue = (int) 500, IsRequired = true)]
      public int SleepTime
      {
        get { return (int)this["sleepTime"]; }
      }
    }
    

    这是我的配置部分(我已经去掉了许多其他可以正常工作的元素)

    public class DataConfigurationSection : ConfigurationSection
    {
        public const string SectionName = "SAM.Configuration.Data";
    
        private static DataConfigurationSection _configSection;
    
        [ConfigurationProperty("serviceBroker", IsRequired = false)]
        public ServiceBrokerConfigurationElement ServiceBroker
        {
            get
            {
                return (ServiceBrokerConfigurationElement)this["serviceBroker"];
            }
        }
    
        public static DataConfigurationSection Section
        {
            get
            {
                if (_configSection == null)
                {
                    _configSection = ((DataConfigurationSection)(ConfigurationManager.GetSection(SectionName)));
                }
    
                return _configSection;
            }
        }
    
    }
    
    3 回复  |  直到 15 年前
        1
  •  0
  •   Steve Guidi    15 年前

    能否验证应用程序配置文件是否包含相关的配置节声明?要将配置节映射到实现它的类型,需要如下内容。

    <configuration>
      <configSections>
        <section name="SamConfigurationData" type="Namespace.DataConfigurationSection, AssemblyName"/>
      </configSections>
    
      <SamConfigurationData>
        <serviceBroker sleepTime="1000"> 
          <queues>  
            <queue name="TestQueue" priority="1"/>
          </queues>
        </serviceBroker>
      </SamConfigurationData>
    </configuration>
    
        2
  •  0
  •   Erwin Alva    15 年前

    我没发现什么不对劲,但我得自己试试。这是我工作的版本,并与你的版本(包括缺失的部分)进行比较。如果您仍然看到发生了可怕的错误,可以将try/catch放在它调用GetSection的位置。

    应用程序配置:

      <configSections>
        <section name="SAM.Configuration.Data" type="Test.DataConfigurationSection, Test" />
      </configSections>
    
      <SAM.Configuration.Data>
        <serviceBroker sleepTime="1000">
          <queues>
            <queue name="TestQueue" priority="1"/>
          </queues>
        </serviceBroker>
      </SAM.Configuration.Data>
    

    配置类:

    public class DataConfigurationSection : ConfigurationSection
    {
        public const string SectionName = "SAM.Configuration.Data";
    
        private static DataConfigurationSection _configSection;
    
        [ConfigurationProperty("serviceBroker", IsRequired = false)]
        public ServiceBrokerConfigurationElement ServiceBroker
        {
            get
            {
                return (ServiceBrokerConfigurationElement)this["serviceBroker"];
            }
        }
    
        public static DataConfigurationSection Section
        {
            get
            {
                if (_configSection == null)
                {
                    _configSection = ((DataConfigurationSection) ConfigurationManager.GetSection(SectionName)));
                }
    
                return _configSection;
            }
        }
    }
    
    public class ServiceBrokerConfigurationElement : ConfigurationElement
    {
        [ConfigurationCollection(typeof(ServiceBrokerQueueElement), AddItemName = "queue")]
        [ConfigurationProperty("queues", IsRequired = true)]
        public ServiceBrokerQueueElementCollection Queues
        {
            get { return (ServiceBrokerQueueElementCollection)this["queues"]; }
        }
    
        [ConfigurationProperty("sleepTime", DefaultValue = (int)500, IsRequired = true)]
        public int SleepTime
        {
            get { return (int)this["sleepTime"]; }
        }
    }
    
    public class ServiceBrokerQueueElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceBrokerQueueElement();
        }
    
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceBrokerQueueElement)element).Name;
        }
    
        public new ServiceBrokerQueueElement this[string name]
        {
            get
            {
                return (ServiceBrokerQueueElement)this.BaseGet(name);
            }
        }
    }
    
    public class ServiceBrokerQueueElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true)]
        public string Name
        {
            get
            {
                return (string)this["name"];
            }
            set
            {
                this["name"] = value;
            }
        }
    
        [ConfigurationProperty("priority", IsRequired = true)]
        public int Priority
        {
            get
            {
                return (int)this["priority"];
            }
            set
            {
                this["priority"] = value;
            }
        }
    }
    
        3
  •  0
  •   Dugan    15 年前

    它基本上与配置部分的内容没有任何关系,我在Castle.Windsor把所有东西都连接错了。它总是返回ServiceBrokerConfiguration的空实例,而不是从app.config加载的实例。

    谢谢大家的帮助。

    推荐文章