app.config中的自由格式XML配置部分正文

时间:2010-07-21 20:50:05

标签: c# .net configuration

有没有办法制作一个允许自由格式XML主体的配置部分?我如何在代码中获得自由形式的主体?

例如,我想像这样创建一个ModuleConfigurationSection:

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

因此,有些代码会使用ConfigurationManager.GetSection("modules")从配置部分中提取每个模块类型,并且我希望将moduleConfig元素中的XML作为不透明配置值传递给构造函数。模块类。

任何意见都赞赏!

2 个答案:

答案 0 :(得分:10)

这就是我最终完成此任务的方式:

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

所以xml看起来像:

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

config元素的主体可以是您喜欢的任何自由形式的xml。假设您设置了一个集合,当您执行ConfigurationManager.GetSection("modules")时,您可以访问每个Config对象的ModuleElement属性作为表示配置元素节点的XML的XElement。

答案 1 :(得分:1)

在我的应用程序中,我无法使用.NET 3.5 Framework。我使用了一种稍微不同的方法,并提出了这段代码:

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