2011-09-11 15 views
9

Ho le seguenti bit in App.config per un servizio di Windows .NET 3.5:eccezione elemento non riconosciuto con l'abitudine C# config

<configSections> 
    <section name="ConfigurationServiceSection" type="SomeApp.Framework.Configuration.ConfigurationServiceSection, SomeApp.Framework"/> 
</configSections> 

<ConfigurationServiceSection configSource="ConfigSections\configurationServiceSection.config" /> 

Ho questo in configurationServiceSection.config:

<ConfigurationServiceSection> 
    <ConfigurationServices> 
     <ConfigurationService name="LocalConfig" host="localhost" port="40001" location="LON"/> 
    </ConfigurationServices> 
</ConfigurationServiceSection> 

Ed ecco il codice:

using System.Configuration; 

namespace SomeApp.Framework.Configuration 
{ 
    public sealed class ConfigurationServiceSection : ConfigurationSection 
    { 
     [ConfigurationProperty("ConfigurationServices", IsDefaultCollection = true, IsRequired = true)] 
     [ConfigurationCollection(typeof(ConfigurationServices))] 
     public ConfigurationServices ConfigurationServices 
     { 
      get 
      { 
       return (ConfigurationServices)base["ConfigurationServices"]; 
      } 
     } 
    } 

    public sealed class ConfigurationServices : ConfigurationElementCollection 
    { 
     protected override ConfigurationElement CreateNewElement() 
     { 
      return new ConfigurationService(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      ConfigurationService configService = (ConfigurationService) element; 
      return configService.Name; 
     } 
    } 

    public sealed class ConfigurationService : ConfigurationElement 
    { 
     /// <summary> 
     /// name 
     /// </summary> 
     [ConfigurationProperty("name", IsKey = true, IsRequired = true)] 
     public string Name 
     { 
      get { return (string)this["name"]; } 
      set { this["name"] = value; } 
     } 

     /// <summary> 
     /// host 
     /// </summary> 
     [ConfigurationProperty("host", IsKey = false, IsRequired = true)] 
     public string Host 
     { 
      get { return (string)this["host"]; } 
      set { this["host"] = value; } 
     } 

     /// <summary> 
     /// port 
     /// </summary> 
     [ConfigurationProperty("port", IsKey = false, IsRequired = true)] 
     public string Port 
     { 
      get { return (string)this["port"]; } 
      set { this["port"] = value; } 
     } 

     /// <summary> 
     /// location 
     /// </summary> 
     [ConfigurationProperty("location", IsKey = false, IsRequired = true)] 
     public string Location 
     { 
      get { return (string)this["location"]; } 
      set { this["location"] = value; } 
     } 
    } 
} 

Quando provo ad accedere alla configurazione con il seguente:

var configurationServiceSection = (ConfigurationServiceSection)configuration.GetSection("ConfigurationServiceSection"); 

ottengo questa eccezione:

Unrecognized element 'ConfigurationService'. (C:\Code\branches\ConfigurationService\SomeApp\Src\ConfigService\SomeApp.ConfigService.WindowsService\bin\Debug\ConfigSections\configurationServiceSection.config line 3) 

Tutto sembra in ordine a me?

Qualche idea per favore? Grazie.

+0

Vedere anche: [Come posso risolvere “l'elemento non riconosciuto 'elementName'] (http://stackoverflow.com/questions/1985047/how-can-i-solve-unrecognized-element -elementname-line-x-line-x). –

risposta

11

Ok avuto modo di fondo di questo:

ho aggiunto 'AddItemName' alla classe ConfigurationServiceSection, come sotto indicato:

public sealed class ConfigurationServiceSection : ConfigurationSection 
{ 
    [ConfigurationProperty("ConfigurationServices", IsDefaultCollection = true, IsRequired = true)] 
    [ConfigurationCollection(typeof(ConfigurationServices), AddItemName = "ConfigurationService")] 
    public ConfigurationServices ConfigurationServices 
    { 
     get 
     { 
      return (ConfigurationServices)base["ConfigurationServices"]; 
     } 
    } 
} 

Un'altra alternativa era quella di sostituire le proprietà CollectionType e ElementName, come da qui di seguito:

public override ConfigurationElementCollectionType CollectionType 
{ 
    get { return ConfigurationElementCollectionType.BasicMap; } 
} 

protected override string ElementName 
{ 
    get { return "ConfigurationService"; } 
} 
+0

Form me era il "return ConfigurationElementCollectionType.BasicMap;" che dovevo cambiare in "return ConfigurationElementCollectionType.AddRemoveClearMap;" ma questo post mi ha aiutato a ottenere quella risposta! – Dib

+0

Questa soluzione AddItemName è abbastanza ovvia. Abbastanza intuitivo. Abbastanza da scoprire Progettare il framework di configurazione in modo che la struttura xml assomigli al modello a oggetti, fino a quando non si tenta di aggiungere elementi a una raccolta, a quel punto si utilizza l'elemento xml invece del tipo/nome dell'oggetto. Ciò manterrà indovinare. Per circa 6 ore. –

+0

Sostituire ElementName nella classe di raccolta è stata la parte cruciale per far funzionare questo lavoro per me. L'impostazione di AddItemName non era sufficiente. Inutile dire che questo manca negli esempi MSDN. –