2012-08-06 51 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