0

特定のビジネス エンティティ (国) の構成設定が必要なアプリケーションがあります。構成は次のようになります。

<country value="US">
   <metadata>
      <key name="filePath" value="c:\blah">
      <key name="wsPath" value="http://blah.com">
   </metadata>
   <sublayouts>
     <template value="division">
       <key name="path" value="c:\blah\file.txt">
     </division>
   </sublayouts>
</country>
<country value="FR">
   <metadata>
      <key name="filePath" value="c:\blah">
      <key name="wsPath" value="http://blah.com">
   </metadata>
   <sublayouts>
     <template value="division">
       <key name="path" value="c:\blah\file.txt">
     </division>
   </sublayouts>
</country>

私が欲しいのは、これを私がいるサイトの静的オブジェクトに読み込むことができるようにすることです。したがって、米国のサイトの場合、value="US" を持つ国ノード全体にロードされます。ロードしたら、次のように読めるようにしたい:

string var = Config.metaData.filePath

また

string var = Config.sublayouts.template["division"].path;

これは実行可能ですか?これを行う優れた設計パターン (それほど難しくない) はありますか? 私は、XML の構造が理にかなっている限り、喜んで変更します。必要に応じて新しいセクションを追加できるようにしたい。基本的には、プログラムで保守するのがそれほど難しくない、柔軟な構成システムを用意するという考え方です。

4

2 に答える 2

1

ExpandoObjectを使用すると、C# 4.0のDynamicを利用できます。次のように、ExpandoObject を IDictionary にキャストすることで、データを Xml から ExpandoObject に動的にロードできます。

 dynamic country = new ExpandoObject();
 var countryDic = country as IDictionary<string, object>;

 dynamic metadata = new ExpandoObject();
 var metadataDic = metadata as IDictionary<string, object>;
 metadataDic["filePath"] = "your file path";

 countryDic["metadata"] = metadata;
 var filePath = country.metadata.filePath;

詳細: ExpandoObject の紹介

于 2012-08-05T06:41:01.563 に答える
0

やりたいことは、最初にデータ コンテナーを設計することです。つまり、各 XML ノード タイプ (Country と Template) のクラスが作成されます。次のようなものが得られます。

class Country {
  IList<KeyValuePair<string, string>> MetaData {get;set;}
  IList<Template> Sublayouts {get;set;}
}

そのデータを取得したら、XML との間でシリアル化するためのいくつかのオプションがあります: DataContractSerializer、BinaryFormatter、XmlSerializer など。

于 2012-08-04T04:50:17.843 に答える