Почему мой ConfigurationElement не читает свои значения из app.config? - PullRequest
2 голосов
/ 20 ноября 2010

Я использую System.Configuration.ConfigurationElement для представления некоторых данных в моем app.config.Он правильно обнаруживает, что раздел существует (если раздел не выдает ошибку), но он никогда не заполняется правильно.Для очередей я получаю только пустую коллекцию, а для sleepTime я получаю только 500.

здесь есть соответствующий раздел app.config:

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

вот полное приложение.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>

А вот мой ConfigurationElement:

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"]; }
  }
}

Вот мой ConfigurationSection (я удалил ряд других элементов, которые работают нормально)1013 *

Ответы [ 3 ]

0 голосов
/ 20 ноября 2010

Я не видел ничего плохого, но я должен был попробовать это сам. Вот версия, которую я получил, и сравните ее с тем, что у вас есть (включая недостающие части). Вы можете поместить команду try / catch в то место, где она вызывает GetSection, если вы все еще видите, что происходит что-то ужасно неправильное.

App.config:

  <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;
        }
    }
}
0 голосов
/ 20 ноября 2010

И это в основном не имело никакого отношения к разделу «Конфигурация», у меня все было неправильно подключено в Castle.Windsor. Он всегда возвращал пустой экземпляр ServiceBrokerConfiguration вместо одного, загруженного из app.config.

Спасибо всем за помощь.

0 голосов
/ 20 ноября 2010

Можете ли вы проверить, что файл конфигурации вашего приложения содержит соответствующую декларацию раздела конфигурации? Для сопоставления раздела конфигурации с типом, который его реализует, требуется что-то вроде следующего.

<configuration>
  <configSections>
    <section name="SamConfigurationData" type="Namespace.DataConfigurationSection, AssemblyName"/>
  </configSections>

  <SamConfigurationData>
    <serviceBroker sleepTime="1000"> 
      <queues>  
        <queue name="TestQueue" priority="1"/>
      </queues>
    </serviceBroker>
  </SamConfigurationData>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...