Sezione di configurazione personalizzata semplice con raccolta in .NET4

Sto cercando di scrivere una sezione di configurazione personalizzata molto semplice per un'applicazione .NET4. Il mio obiettivo è this:


  
    

Tuttavia, continuo a ricevere un ConfigurationErrorsException : 'Unrecognized element' add '' quando chiamo ConfigurationManager.GetSection ("myServices") . è da un po 'di tempo ma non ho ancora capito cosa sto facendo di sbagliato. Di seguito è riportato il mio codice. Sono tre classi: ConfigSection , MyServiceSettingsCollection e MyServiceSettings .

Innanzitutto la classe che rappresenta l'intera sezione di configurazione. Ha una raccolta predefinita senza nome di tipo MyServiceSettingsCollection . La proprietà IsDefaultCollection dovrebbe consentirmi di "aggiungere" direttamente al mio raccolta dall'elemento radice.

public sealed class ConfigSection : ConfigurationSection
{
  private static readonly ConfigurationProperty _propMyServices;

  private static readonly ConfigurationPropertyCollection _properties;

  public static ConfigSection Instance { get { return _instance; } }

  static ConfigSection()
  {
    _propMyServices = new ConfigurationProperty(
          null, typeof(MyServiceSettingsCollection), null,
          ConfigurationPropertyOptions.IsDefaultCollection);
    _properties = new ConfigurationPropertyCollection { _propMyServices };
  }

  [ConfigurationProperty("", IsDefaultCollection = true)]
  public MyServiceSettingsCollection MyServices
  {
    get { return (MyServiceSettingsCollection) base[_propMyServices]; }
    set { base[_propMyServices] = value; }
  }

  protected override ConfigurationPropertyCollection Properties
  { get { return _properties; } }
}

Successivamente, la classe raccolta stessa. È di tipo AddRemoveClearMap .

[ConfigurationCollection(typeof(MyServiceSettings),
    CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
public sealed class MyServiceSettingsCollection : ConfigurationElementCollection
{
  public MyServiceSettings this[int index]
  {
    get { return (MyServiceSettings) BaseGet(index); }
    set
    {
      if (BaseGet(index) != null) { BaseRemoveAt(index); }
      BaseAdd(index, value);
    }
  }

  public new MyServiceSettings this[string key]
  {
    get { return (MyServiceSettings) BaseGet(key); }
  }

  protected override ConfigurationElement CreateNewElement()
  {
    return new MyServiceSettings();
  }

  protected override object GetElementKey(ConfigurationElement element)
  {
    return ((MyServiceSettings) element).Key;
  }
}

E f in fondo una classe per gli elementi nella raccolta. Per ora, questa classe ha una proprietà ma ce ne saranno altre in seguito (il che mi impedisce di usare NameValueSectionHandler ).

public class MyServiceSettings : ConfigurationElement
{
  private static readonly ConfigurationProperty _propName;

  private static readonly ConfigurationPropertyCollection properties;

  static MyServiceSettings()
  {
    _propName = new ConfigurationProperty("name", typeof(string), null, null,
                                          new StringValidator(1),
                                          ConfigurationPropertyOptions.IsRequired |
                                          ConfigurationPropertyOptions.IsKey);
    properties = new ConfigurationPropertyCollection { _propName };
  }

  [ConfigurationProperty("name", DefaultValue = "",
        Options = ConfigurationPropertyOptions.IsRequired |
                  ConfigurationPropertyOptions.IsKey)]
  public string Name
  {
      get { return (string) base[_propKey]; }
      set { base[_propKey] = value; }
  }

  protected override ConfigurationPropertyCollection Properties
  { get { return properties; } }
}

10
задан Ronald Wildenberg 15 August 2011 в 15:08
поделиться