动态读取配置设置属性

时间:2012-08-04 04:42:39

标签: c# asp.net xml design-patterns configuration

我有一个应用程序,我需要为特定的业务实体(即国家/地区)配置设置。配置将是这样的:

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

我想要的是能够将其读入我所在站点的静态对象。因此,对于美国站点,它将加载到值为“US”的整个国家/地区节点。加载后,我希望能够像:

一样阅读

string var = Config.metaData.filePath

OR

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

这甚至可行吗?有这么好的设计模式(不是太难)吗?只要有意义,我完全愿意改变XML的结构。我希望能够在我想要的时候添加新的部分。基本上,我们的想法是拥有一个灵活的配置系统,这个系统不难以编程方式进行维护。

2 个答案:

答案 0 :(得分:1)

您可以使用 ExpandoObject 在C#4.0中利用动态。通过将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;

更多信息:Introducing the ExpandoObject

答案 1 :(得分:0)

您要做的是首先设计数据容器。换句话说,您将最终得到每个XML节点类型的类:Country和Template。你会得到这样的东西:

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

一旦获得了这些数据,您就可以通过以下几种方式将其序列化为XML:DataContractSerializer,BinaryFormatter,XmlSerializer等。