2012-08-06 80 views
0

我有一个app.config部分我想定义,作为一个简单的IDictionary<string, IDictionary<string, string>>会是这个样子的app.config文件:自定义配置节 - KISS方法

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

所有的教程我“M看到似乎得到相当深成这样,我只是在寻找一个快速和肮脏的方式做到这一点:

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

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

回答

1

您可以使用配置部分设计师做肮脏的工作:

http://csd.codeplex.com/

它具有视觉工作室设计器支持,生成示例配置,目前为止有一个问题 - 在VS2012需要安装VS2010的情况下,但我认为这将很快得到解决。

+0

这强烈地键入配置设置;将其转换为字典对象似乎很平凡。 – 2012-08-06 15:59:54

+0

原来它并不平庸:向部分类方法'ToDictionary'添加到生成的'ServiceInstance'类中,返回'this.Properties.OfType ()。ToDictionary(key => key.Name,value => this [value .Name] .ToString())'这似乎做我想要的。 – 2012-08-06 16:12:03

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

这似乎没有意识到app.config文件。我认为这将作为替代XML文件。 – 2012-08-06 13:48:01