2011-06-16 10 views
13

Tengo problemas para que funcione una sección de configuración personalizada. Es un código que obtuve de la web en un esfuerzo por tratar de entender esta área un poco mejor y permitirme llegar a donde quiero estar, mi propia sección de configuración personalizada.Sección de configuración personalizada que contiene la colección

El error que consigo cuando ejecuto el código en una aplicación de consola es ' no reconocido atributo 'extensión'. Tenga en cuenta que los nombres de los atributos distinguen mayúsculas de minúsculas '

El código de la aplicación principal para que funcione es

var conf = ConfigurationManager.GetSection("uploadDirector"); 

y aquí es donde aparece la excepción.

Esta es la sección de configuración que estoy esperando/tratando de lograr

<AuthorisedClients> 
    <AuthorisedClient name="Client"> 
     <Queue id="1" /> 
     <Queue id="7" /> 
    </AuthorisedClient> 
    <AuthorisedClient name="Client2"> 
     <Queue id="3" /> 
     <Queue id="4" /> 
    </AuthorisedClient> 
    </AuthorisedClients> 

Aquí está el código que tengo desde la web

archivo .config

<uploadDirector> 
    <filegroup name="documents" defaultDirectory="/documents/"> 
     <clear/> 
     <add extension="pdf" mime="application/pdf" maxsize="100"/> 
     <add extension="doc" mime="application/word" maxsize="500"/> 
    </filegroup> 
    <filegroup name="images"> 
     <clear/> 
     <add extension="gif" mime="image/gif" maxsize="100"/> 
    </filegroup> 
    </uploadDirector> 

UploadDirectorConfigSection .cs

public class UploadDirectorConfigSection : ConfigurationSection { 

     private string _rootPath; 

     public UploadDirectorConfigSection() { 

     } 

     [ConfigurationProperty("rootpath", DefaultValue="/", IsRequired=false, IsKey=false)] 
     [StringValidator([email protected]"[email protected]#$%^&*()[]{};'\|\\")] 
     public string RootPath { 
      get { return _rootPath; } 
      set { _rootPath = value; } 
     } 

     [ConfigurationProperty("", IsRequired = true, IsKey = false, IsDefaultCollection = true)] 
     public FileGroupCollection FileGroups { 
      get { return (FileGroupCollection) base[""]; } 
      set { base[""] = value; } 
     } 
    } 

FileGroupCollection.cs

public class FileGroupCollection : ConfigurationElementCollection { 
     protected override ConfigurationElement CreateNewElement() { 
      return new FileGroupElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) { 
      return ((FileGroupElement) element).Name; 
     } 

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

     protected override string ElementName { 
      get { 
       return "filegroup"; 
      } 
     } 

     protected override bool IsElementName(string elementName) { 
      if (string.IsNullOrWhiteSpace(elementName) || elementName != "filegroup") 
       return false; 
      return true; 
     } 

     public FileGroupElement this[int index] { 
      get { return (FileGroupElement) BaseGet(index); } 
      set { 
       if(BaseGet(index) != null) 
        BaseRemoveAt(index); 
       BaseAdd(index, value); 
      } 
     } 
    } 

FileGroupElement.cs

public class FileGroupElement : ConfigurationElement { 

     [ConfigurationProperty("name", IsKey=true, IsRequired = true)] 
     [StringValidator(InvalidCharacters = @" [email protected]#$%^&*()[]{}/;'""|\")] 
     public string Name { 
      get { return (string) base["name"]; } 
      set { base["name"] = value; } 
     } 

     [ConfigurationProperty("defaultDirectory", DefaultValue = ".")] 
     public string DefaultDirectory { 
      get { return (string) base["Path"]; } 
      set { base["Path"] = value; } 
     } 

     [ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)] 
     public FileInfoCollection Files { 
      get { return (FileInfoCollection) base[""]; } 
     } 
    } 

FileInfoCollection.cs

public class FileInfoCollection : ConfigurationElementCollection { 
     protected override ConfigurationElement CreateNewElement() { 
      return new FileInfoCollection(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) { 
      return ((FileInfoElement) element).Extension; 
     } 
    } 

FileInfoElement.cs

public class FileInfoElement : ConfigurationElement { 

     public FileInfoElement() { 
      Extension = "txt"; 
      Mime = "text/plain"; 
      MaxSize = 0; 
     } 

     [ConfigurationProperty("extension", IsKey = true, IsRequired = true)] 
     public string Extension { 
      get { return (string)base["extension"]; } 
      set { base["extension"] = value; } 
     } 

     [ConfigurationProperty("mime", DefaultValue = "text/plain")] 
     public string Mime { 
      get { return (string) base["mime"]; } 
      set { base["mime"] = value; } 
     } 

     [ConfigurationProperty("maxsize", DefaultValue = 0)] 
     public int MaxSize { 
      get { return (int) base["maxsize"]; } 
      set { base["maxsize"] = value; } 
     } 
    } 

Respuesta

30

En su definición de FileInfoCollection en el método CreateNewElement crear FileInfoCollection que está mal. Anulado CreateNewElement debe devolver nuevo elemento de la colección, no la nueva colección:

public class FileInfoCollection : ConfigurationElementCollection 
{ 
    protected override ConfigurationElement CreateNewElement() 
    { 
     return new FileInfoElement(); 
    } 

    protected override object GetElementKey (ConfigurationElement element) 
    { 
     return ((FileInfoElement)element).Extension; 
    } 
} 

En cuanto a su configuración deseada, probablemente la aplicación más simple se parecerá a:

public class AuthorisedClientsSection : ConfigurationSection { 
    [ConfigurationProperty("", IsDefaultCollection = true)] 
    public AuthorisedClientElementCollection Elements { 
     get { return (AuthorisedClientElementCollection)base[""];} 
    } 
} 

public class AuthorisedClientElementCollection : ConfigurationElementCollection { 
    const string ELEMENT_NAME = "AuthorisedClient"; 

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

    protected override string ElementName { 
     get { return ELEMENT_NAME; } 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) { 
     return ((AuthorisedClientElement)element).Name; 
    } 
} 

public class AuthorisedClientElement : ConfigurationElement { 
    const string NAME = "name"; 

    [ConfigurationProperty(NAME, IsRequired = true)] 
    public string Name { 
     get { return (string)base[NAME]; } 
    } 

    [ConfigurationProperty("", IsDefaultCollection = true)] 
    public QueueElementCollection Elements { 
     get { return (QueueElementCollection)base[""]; } 
    } 
} 

public class QueueElementCollection : ConfigurationElementCollection { 
    const string ELEMENT_NAME = "Queue"; 

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

    protected override string ElementName { 
     get { return ELEMENT_NAME; } 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) { 
     return ((QueueElement)element).Id; 
    } 
} 

public class QueueElement : ConfigurationElement { 
    const string ID = "id"; 

    [ConfigurationProperty(ID, IsRequired = true)] 
    public int Id { 
     get { return (int)base[ID]; } 
    } 
} 

Y la prueba:

var authorisedClientsSection = ConfigurationManager.GetSection("AuthorisedClients") 
    as AuthorisedClientsSection; 

foreach (AuthorisedClientElement client in authorisedClientsSection.Elements) { 
    Console.WriteLine("Client: {0}", client.Name); 

    foreach (QueueElement queue in client.Elements) { 
     Console.WriteLine("\tQueue: {0}", queue.Id); 
    } 
} 
+0

Wow, ese es mi problema exacto también. ¡Gracias! –

+0

Este fue mi problema también. Muchas gracias. Atrapa un upvoite :-). – Oybek

+0

¡Gracias señor! Perfecto, ¡ojalá pudiera votar dos veces! – Jonas

Cuestiones relacionadas