Aunque hemos creado colecciones de elementos en las secciones de configuración personalizadas no nos dejemos engañar, hay mucho más acerca de las colecciones de elementos de configuración que simplemente conocer como agregar elementos nuevos.
Tipos de colecciones de configuración
Existe un enumerador especial, ConfigurationElementCollectionType, que nos sirve como indicador de “cómo” debe ser el comportamiento de la colección. Al principio uno piensa “¿cómo así el comportamiento? una colección simplemente es un número finito secuencial de elementos”. Bueno, veamos en que difiere cada tipo:
AddRemoveClearMap |
El tipo por defecto, los elementos de la colección pueden unirse o fusionarse dentro de una jerarquía de archivos de configuración (por ejemplo, la jerarquía en Web.config). Existen operaciones de Clear, Remove, Add que permiten modificar las propiedades heredadas dentro de la jerarquía |
AddRemoveClearMapAlternate |
Igual que AddRemoveClearMap, con la diferencia en que sus elementos ordenan sus elementos en la definición actual antes que la de la jerarquía. Estando los elementos locales antes que los elementos heredados (en la colección) |
BasicMap |
Los elementos definidos en un nivel son compartidos con los de los niveles hijos, pero los niveles hijos no pueden modificar la colección definida por su padre |
BasicMapAlternate |
Funciona igual al BasicMap, pero los elementos heredados son mostrados después que los elementos locales |
Las colecciones de tipo BasicMap no poseen operaciones de add, remove, clear. Los tipos Alternate incluyen los elementos padres después de la definición de elementos locales. Lo más común es mantenerse en colecciones de tipo AddRemoveClearMap y utilizar BasicMap cuando realmente queremos asegurarnos que no se debe modificar la colección.
Definir nodos como elementos
Otra opción poco común pero sencilla de hacer es evitar utilizar la palabra add para agregar el nodo a la colección y en vez de eso utilizar el elemento como nodo de la colección. Esto es realmente sencillo y muchas veces nos puede mejorar la claridad del código de configuración. El secreto es simplemente hacer override de las propiedades de la colección que se encarga de retornar los nombres de los elementos en la colección, ElementName y CollectionType, y opcional a ello indicar el tipo de colección que utilizaremos marcando la colección con una propiedad de un atributo, ConfigurationCollectionAttribute.
using System.Configuration;
namespace Samples {
[ConfigurationCollection(typeof (ServerConfigurationElement),
CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class ServerConfigurationCollection : ConfigurationElementCollection {
public ServerConfigurationElement this[int index] {
get { return BaseGet(index) as ServerConfigurationElement; }
set {
if (BaseGet(index) != null)
BaseRemoveAt(index);
BaseAdd(index, value);
}
}
public new ServerConfigurationElement this[string name] {
get { return BaseGet(name) as ServerConfigurationElement; }
}
public override ConfigurationElementCollectionType CollectionType {
get { return ConfigurationElementCollectionType.BasicMap; }
}
protected override string ElementName {
get { return "server"; }
}
protected override ConfigurationElement CreateNewElement() {
return new ServerConfigurationElement();
}
protected override object GetElementKey(ConfigurationElement element) {
var value = element as ServerConfigurationElement;
return value != null ? value.Name : null;
}
}
}
Y nuestro archivo de configuración ahora tendría la siguiente forma
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="sample"
type="Samples.SampleConfigurationSection, Samples.Cfg.AdvancedCollections"/>
</configSections>
<sample default="default">
<servers>
<server name="default" host="localhost" />
<server name="another" port="8080" host="192.168.1.1" />
</servers>
</sample>
</configuration>
Algunos quizás encontraran esto ligeramente más fácil de leer que la versión original publicada en la parte 4 de esta serie.
Rayos, sin darnos cuenta llevamos ya cinco artículos sobre configuración personalizada en .Net (no se preocupen, aún faltan muchos más), el tiempo vuela cuando uno se divierte
, como siempre agradezco sus comentarios, tags, pings, whatever… siempre son bienvenidos….
Y bueno, como dice Porky…
