2010-07-21 7 views
7

Gibt es eine Möglichkeit, einen Konfigurationsabschnitt zu machen, die einen Freiform-XML Körper erlauben würden? Wie würde ich bekommen, dass Freiformkörper in Code?Freeform XML-Konfigurationsabschnitt Körper in app.config

Zum Beispiel würde ich gerne eine ModuleConfigurationSection wie diese erstellen:

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

So einige Code würde mit ConfigurationManager.GetSection("modules") jedes dieser Modultypen von Konfigurationsabschnitten spin up und ich möchte die XML innen passieren moduleConfig das Element als opaker Konfigurationswert an den Konstruktor des Modulklasse.

Jede Eingabe zu schätzen!

Antwort

10

Dies ist, wie ich dies zu erreichen, endete:

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

So würde die XML wie folgt aussehen:

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

Der Körper des Elements Config jede Freiform-xml sein könnte, die Sie mögen. Unter der Annahme, dass man eine Sammlung einrichten, wenn Sie ConfigurationManager.GetSection("modules") tun kann dann Zugriff auf die Config Eigenschaft jeden ModuleElement Objekt als XElement, die die XML-Konfigurations des Elementknotens.

1

In meiner Anwendung kann ich nicht die .NET 3.5 Framework verwenden. Früher habe ich einen etwas anderen Ansatz und kam mit diesem Stück Code oben:

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

Sie sollten die 'XmlNode' für das Element, das Sie genau wie in meiner Antwort möchte der Lage sein, Curry weg, wo ich die' XElement' speichern . Ich habe deinen Code aktualisiert, um dies zu zeigen. – joshperry