2010-07-21 11 views
7

C'è un modo per creare una sezione di configurazione che consentirebbe un corpo XML a forma libera? Come potrei ottenere quel corpo a mano libera nel codice?Corpo della sezione di configurazione XML a forma libera in app.config

Per esempio mi piacerebbe creare un ModuleConfigurationSection come questo:

<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> 

Così alcuni codice sarebbe spin up ciascuno di questi tipi di moduli da sezioni di configurazione utilizzando ConfigurationManager.GetSection("modules") e mi piacerebbe passare il XML all'interno l'elemento moduleConfig come un valore di configurazione opaco per il costruttore della classe del modulo.

Qualsiasi input apprezzato!

risposta

10

Questo è come ho finito per realizzare questo:

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); 
    } 
} 

Così l'XML sarà simile:

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

Il corpo dell'elemento di configurazione potrebbe essere qualsiasi XML a forma libera che ti piace. Supponendo di impostare una raccolta, quando si esegue ConfigurationManager.GetSection("modules") è quindi possibile accedere alla proprietà Config di ciascun oggetto ModuleElement come XElement che rappresenta l'XML del nodo dell'elemento di configurazione.

1

Nella mia applicazione non ho potuto utilizzare .NET 3.5 Framework. Ho usato un approccio leggermente diverso e si avvicinò con questo pezzo di codice:

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

Dovreste essere in grado di accattivarsi il via il 'XmlNode' per l'elemento che si desidera, proprio come nella mia risposta, dove risparmio il' XElement' . Ho aggiornato il tuo codice per mostrarlo. – joshperry

Problemi correlati