早上到公司都习惯迅速浏览一下新闻,朝鲜宣布进入战斗准备状态 随时准备导弹攻击,中日钓鱼岛事件...,再和同事愤青一番,又想到欧洲一个主教的墓志铭,他说:当我年轻的时候,我以为我可以改变世界,但是随著年龄的增加,我发现我没有这个能力,於是我决定我只改变我的国家,但是我并不能改变我的国家,到我老的时候,我就想改变我的家人,但是我发现我的家人也不愿意被我改变,我才恍然大悟,如果当初我改变自己……

  自上一篇项目中的配置文件优化方案后,觉得不太符合当前的业务,于是在领导的亲自指导下,有了这篇配置文件优化方案(二),主要介绍 Visual Studio 2010的一个配置文件插件ConfigurationSectionDesigner,该插件是基于.Net配置体系。下载安装即可,同时在网上还有该插件的源码,有兴趣也可研究研究。

  下面一步一步介绍插件的使用,也给自己做一个知识的积累,要实现配置文件分模块、分类展示,.Net配置体系中可以是一个Section一个模块,可以参照WCF的配置结构。例如对于下面的一堆配置,平时使用时也只是解析Xml,非常不方便,我们就利用这个插件把他们都放在一个Section里面,使用起来也很方便。

优化前配置项

View Code
 1     <add key="localIPV4Scope" value="10."/>
 2     <add key="tcpCommTimeout" value="60000"/>
 3     <add key="localIPV4Scope" value="10."/>
 4     <add key="encoding" value="UTF-8"/>
 5     <add key="output" value="C:\"/>
 6     <add key="style" value="Style1"/>
 7     <mainFrameService>
 8       <service name="SPD0" channel="SPDTCP" server="192.168.1.100:6005" servicetype=""/>
 9       <service name="SPD1" channel="SPDTCP" server="192.168.1.101:6005" servicetype=""/>
10       <service name="SPD2" channel="SPDTCP" server="192.168.1.102:8991" servicetype=""/>
11     </mainFrameService>
12   </appSettings>

优化后配置项

View Code
 1 <MyConfig localIPV4Scope="10." 
 2           tcpCommTimeout="60000" 
 3           description="MyConfig">
 4   <systemConfig encoding="UTF-8"
 5                 output="C:\"
 6                 style="Style1"/>
 7    <mainFrameService>
 8       <service name="SPD0" channel="SPDTCP" server="192.168.1.100:6005" servicetype=""/>
 9       <service name="SPD1" channel="SPDTCP" server="192.168.1.101:6005" servicetype=""/>
10       <service name="SPD2" channel="SPDTCP" server="192.168.1.102:8991" servicetype=""/>
11    </mainFrameService>
12 </MyConfig>

   一、首先Add New Item,找到刚才安装的插件自带的模版,命名为MyConfig.csd

   二、建立配置项模型,在新建的.csd文件左边的Tollbox中有相关的控件,首先拖一个ConfigurationSection命名为MyConfig,分别新增三个Attribute,在属性页分别选择Attribute的Type,再新增两个Element(SystemConfig、MainFrameService),对于SystemConfig,要拖一个ConfigurationElement命名为SystemConfigElement,并新增三个对应的Attribute,同时选择对应的Type,然后把上面SystemConfig的Type指定为SystemConfigElement,这样就关联在一起了,同时出现一个指向的箭头。然后就是MainFrameService了,该节点时一个集合,所以要拖一个ConfigurationElementCollection命名为MainFrameServiceCollection,再拖一个ConfigurationElement命名为Service,同时新增对应的Attribute和指定对应的Type.这样把MainFrameService的Type指定为MainFrameServiceCollection,MainFrameServiceCollection的Item Type指定为Service。配置模型就建立成功了,如下图,保存时,会生成对应的配置项代码。

   三、通过以上工作,我们建立了配置的基本结构,下面是配置的实现结果,如下:

View Code
 1   <configSections>
 2     <section name="myConfig" type="ConfigDesigner.MyConfig, ConfigDesigner"/>
 3   </configSections>
 4   <myConfig localIPV4Scope="10."
 5             tcpCommTimeout="60000"
 6             description="MyConfig">
 7     <systemConfig encoding="UTF-8"
 8                   output="C:\"
 9                   style="Style1"/>
10     <mainFrameService>
11       <service name="SPD0" channel="SPDTCP" server="192.168.1.100:6005" servicetype=""/>
12       <service name="SPD1" channel="SPDTCP" server="192.168.1.101:6005" servicetype=""/>
13       <service name="SPD2" channel="SPDTCP" server="192.168.1.102:8991" servicetype=""/>
14     </mainFrameService>
15   </myConfig>

这样就算配置模块很多,config文件中也显得很清晰,也可以用configSource属性分几个外部配置文件分别配置。使用也很方便,如下:

View Code
 1 var localIPV4Scope = MyConfig.Instance.LocalIPV4Scope;
 2             var tcpCommTimeout = MyConfig.Instance.TcpCommTimeout;
 3             var encoding = MyConfig.Instance.SystemConfig.Encoding;
 4             var output = MyConfig.Instance.SystemConfig.Output;
 5             var style = MyConfig.Instance.SystemConfig.Style;
 6             Console.WriteLine("localIPV4Scope:{0}",localIPV4Scope);
 7             Console.WriteLine("tcpCommTimeout:{0}", tcpCommTimeout);
 8             Console.WriteLine("encoding:{0}", encoding);
 9             Console.WriteLine("output:{0}", output);
10             Console.WriteLine("style:{0}", style);
11 
12             var mainFrameService = MyConfig.Instance.MainFrameService;
13             foreach (Service service in mainFrameService)
14             {
15                 Console.WriteLine("name:{0},channel:{1},server:{2},servicetype:{3}", service.Name, service.Channel, service.Server, service.Servicetype);
16             }
17 
18             Console.ReadLine();

                                                       注重细节,从改变自己做起

  

posted on 2013-03-30 12:39  HaiSnowTian  阅读(1455)  评论(0编辑  收藏  举报