2010-07-21 4 views
7

Existe-t-il un moyen de créer une section de configuration qui autoriserait un corps XML de forme libre? Comment aurais-je ce corps libre dans le code?Corps de section de configuration XML Freeform dans app.config

Par exemple, je voudrais créer un ModuleConfigurationSection comme ceci:

<modules> 
    <module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly"> 
     <moduleConfig> 
      <serviceAddress>http://myserver/myservice.svc</serviceAddress> 
     </moduleConfig> 
    </module> 
    <module name="ModuleB" type="My.Namespace.ModuleB, My.OtherAssembly"> 
     <moduleConfig> 
      <filePath>c:\directory</filePath> 
     </moduleConfig> 
    </module> 
</modules> 

donc un code tourneraient jusqu'à chacun de ces types de modules de sections de configuration à l'aide ConfigurationManager.GetSection("modules") et je voudrais passer le XML à l'intérieur l'élément moduleConfig en tant que valeur de configuration opaque pour le constructeur de la classe de module.

Toute saisie appréciée!

Répondre

10

Voilà comment je fini par y parvenir:

public class ModuleElement : ConfigurationElement 
{ 
    [ConfigurationProperty("name", IsRequired = true)] 
    public string Name 
    { 
     get { return (string)base["name"]; } 
     set { base["name"] = value; } 
    } 

    XElement _config; 
    public XElement Config 
    { 
     get { return _config; } 
    } 

    protected override bool OnDeserializeUnrecognizedElement(string elementName, System.Xml.XmlReader reader) 
    { 
     if (elementName == "config") 
     { 
      _config = (XElement)XElement.ReadFrom(reader); 
      return true; 
     } 
     else 
      return base.OnDeserializeUnrecognizedElement(elementName, reader); 
    } 
} 

Ainsi, le xml ressemblerait à ceci:

<module name="ModuleA"> 
    <config> 
     <filePath>C:\files\file.foo</filePath> 
    </config> 
</module> 

Le corps de l'élément de configuration pourrait être un xml freeform que vous aimez. En supposant que vous définissez une collection, lorsque vous faites ConfigurationManager.GetSection("modules"), vous pouvez ensuite accéder à la propriété Config de chaque objet ModuleElement en tant que XElement représentant le code XML du nœud de l'élément config.

1

Dans mon application, je ne pouvais pas utiliser le .NET 3.5 Framework. J'ai utilisé une approche légèrement différente et est venu avec ce morceau de code:

public class ModuleSection : ConfigurationSection 
{ 
    private const string ELEMENT_NAME_CONFIG = "config"; 

    private XmlNode _configNode; 

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

    public XmlNode Config 
    { 
     get { return _configNode; } 
    } 

    protected override bool OnDeserializeUnrecognizedElement(string elementName, XmlReader reader) 
    { 
     if(elementName.Equals(ELEMENT_NAME_CONFIG, StringComparison.Ordinal)) { 
      // Add the unrecognized element. 
      _configNode = _xmlDocument.ReadNode(reader); 
      return true; 
     } else { 
      return base.OnDeserializeUnrecognizedElement(elementName, reader); 
     } 
    } 
} 
+0

Vous devriez être en mesure de curry loin le 'XmlNode' pour l'élément que vous voulez comme dans ma réponse où je sauve la' XElement' . J'ai mis à jour votre code pour le montrer. – joshperry

Questions connexes