【问题标题】:Custom configuration sections - KISS method自定义配置部分 - KISS 方法
【发布时间】:2012-08-06 21:59:27
【问题描述】:

我想定义一个 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");

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

【问题讨论】:

    标签: c# app-config custom-configuration


    【解决方案1】:

    首先,您将 XML 文件解析为 Dictionary&lt;string, Dictionary&lt;string, string&gt;&gt;。看起来像这样:

    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"];
    

    【讨论】:

    • 这似乎不知道 app.config 文件。我认为这将作为一个替代的 xml 文件。
    【解决方案2】:

    您可以使用配置部分设计器来完成这项肮脏的工作:

    http://csd.codeplex.com/

    它有visual studio设计器支持,生成示例配置,只是到目前为止有一个问题——如果VS2012需要安装VS2010,但我认为很快就会解决。

    【讨论】:

    • 这个强类型配置设置;将其转换为字典对象似乎并不简单。
    • 事实证明这并非不重要:向生成的ServiceInstance 类添加了一个部分类方法ToDictionary 返回this.Properties.OfType&lt;ConfigurationProperty&gt;().ToDictionary(key =&gt; key.Name, value =&gt; this[value.Name].ToString()),这似乎可以满足我的要求。
    猜你喜欢
    • 2010-10-25
    • 2010-11-12
    • 2013-09-17
    • 2011-07-04
    • 2012-12-12
    • 2013-09-21
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多