自定义配置部分 - KISS方法

时间:2012-08-06 13:23:00

标签: c# app-config custom-configuration

我有一个app.config部分我想定义,作为一个简单的IDictionary<string, IDictionary<string, string>>在app.config文件中看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="ServiceInstances" type="MyProject.Configuration, MyProject"/>
    </configSections>
    <ServiceInstances>
        <ServiceInstance name="service1">
            <kvp key="key1" value="value1"/>
            <kvp key="key2" value="value2"/>
        </ServiceInstance>
        <ServiceInstance name="service2">
            <kvp key="key3" value="value3"/>
            <kvp key="key2" value="value2"/>
        </ServiceInstance>
    </ServiceInstances>
</configuration>

我所看到的所有教程似乎都深入探讨了这一点,我只是在寻找一种快速而肮脏的方法来实现这一目标:

IDictionary<string, string> foo = Configuration.GetDictionary("service1");
IDictionary<string, string> bar = Configuration.GetDictionary("service2");

看起来这应该是几行代码,但教程似乎不必要地使它变得复杂。对此有一个快速的答案,如果有,有人可以告诉我它应该是什么样的吗?

2 个答案:

答案 0 :(得分:2)

首先,将XML文件解析为Dictionary<string, Dictionary<string, string>>。看起来像这样:

public Dictionary<string, Dictionary<string, string>> getDictionary()
{
    XmlDocument doc = new XmlDocument();
    doc.Load(@"path/to/file.xml");

    Dictionary<string, Dictionary<string, string>> outer = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, string> inner;

    //cycle through outer nodes
    foreach (XmlNode service in doc.SelectNodes("/configuration/ServiceInstances/ServiceInstance"))
    {
        inner = new Dictionary<string, string>();
        //cycle through inner nodes
        foreach (XmlNode kvp in service.SelectNodes("kvp"))
        {
            inner.Add(kvp.Attributes["key"].Value, kvp.Attributes["value"].Value);
        }
        outer.Add(service.Attributes["name"].Value, inner);
    }

    return outer;
}

然后你可以这样打电话给你的词典:

var foo = getDictionary();
Dictionary<string,string> bar = foo["service1"];

答案 1 :(得分:1)

您可以使用“配置”部分设计器执行脏作业:

http://csd.codeplex.com/

它有视觉工作室设计师支持,生成示例配置,到目前为止只有一个问题 - 在VS2012的情况下需要安装VS2010,但我认为很快就会修复。