2012-08-06 4 views
0

의 app.config 파일에 다음과 같이 보일 것이다 간단한 IDictionary<string, IDictionary<string, string>>로 :사용자 정의 구성 섹션 - KISS 방법 내가 정의하려는의 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> 

튜토리얼의 모두 I 튜토리얼 보이는

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

그것은 말 그대로 몇 줄의 코드해야 다음과 같이 보이지만 : 꽤 깊은이 들어갈 것으로 보인다 보는 해요, 난 그냥이 할 수있는 신속하고 더러운 방법을 찾고 있어요 그것을 불필요하게 복잡하게 만든다. 이 문제에 대한 빠른 대답이 있습니까? 그렇다면 누군가가 내 모습을 보여줄 수 있습니까?

답변

1

당신은 더러운 작업을 수행하기 위해 구성 섹션 디자이너를 사용할 수 있습니다

http://csd.codeplex.com/

을 그것은 시각 스튜디오 디자이너 지원을 가지고 샘플 구성을 생성, 지금까지 한 가지 문제가 있습니다 - VS2012의 경우에는 VS2010을 설치해야하지만 곧 수정 될 것입니다.

+0

이렇게하면 구성 설정을 강력하게 입력 할 수 있습니다. 그것을 사전 객체로 변환하는 것은 사소한 것처럼 보인다. –

+0

ToDictionary (key => key.Name, value => this [value])이 메소드는 생성 된'ServiceInstance' 클래스에 부분 클래스 메소드'ToDictionary'를 추가했습니다. .Name] .ToString())'내가 원하는 것을 수행하는 것 같습니다. –

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 파일로 작동 할 것이라고 생각한다. –