12
返回列表 发新帖
楼主: hphubei

【转】Duwamish深入剖析

[复制链接]
论坛徽章:
8
11#
 楼主| 发表于 2007-1-15 16:46 | 只看该作者
配置节处理程序
   
  前面已经介绍了,section里定义了处理配置节的类:Duwamish7.SystemFramework.ApplicationConfiguration和Duwamish7.Common.DuwamishConfiguration,他们分别位于SystemFramework和Common项目中,.net规定,所有能够处理配置节的类必须要实现IConfigurationSectionHandler接口,而IConfigurationSectionHandler接口很简单,只有一个object Create(object parent,object configContext,XmlNode section)方法,这个方法不需要主动调用,它是在ConfigurationSettings.GetConfig这个静态方法的时候自动调用的,也就是说,当你在程序中使用ConfigurationSettings.GetConfig来获取配置节的时候,.net会根据改配置节声明中所定义的类名和路径自动实例化配置节处理类,并调用Create方法。下面是Duwamish的处理类调用流程:
   
  1、在global.asax的Application_OnStart方法里面调用ApplicationConfiguration.OnApplicationStart静态方法,并获得应用程序根的绝对路径。
   
   void Application_OnStart()
   {
   ApplicationConfiguration.OnApplicationStart(Context.Server.MapPath( Context.Request.ApplicationPath ));
   string configPath = Path.Combine(Context.Server.MapPath( Context.Request.ApplicationPath ),"remotingclient.cfg";
   if(File.Exists(configPath))
   RemotingConfiguration.Configure(configPath);
   }
   
   
  2、ApplicationConfiguration.OnApplicationStart静态方法里调用System.Configuration.ConfigurationSettings.GetConfig方法处理配置节:
   
   public static void OnApplicationStart(String myAppPath)
   {
   appRoot = myAppPath;
   System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration";
   System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration";
   System.Configuration.ConfigurationSettings.GetConfig("SourceViewer";
   }
   
  大家已经注意到了,Duwamish并没有获取GetConfig返回的值,因为前面已经说过,GetConfig方法会引发配置节处理程序的Create方法,所以,只需要在Create方法中将配置值取出来就行了。
   
  3、配置读取示例:Duwamish7.Common.DuwamishConfiguration类
   
  public Object Create(Object parent, object configContext, XmlNode section)
  {
   
   NameValueCollection settings;
   
   try
   {
   NameValueSectionHandler baseHandler = new NameValueSectionHandler();
   settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
   }
   catch
   {
   settings = null;
   }
   
   if ( settings == null )
   {
   dbConnectionString = DATAACCESS_CONNECTIONSTRING_DEFAULT;
   pageCacheExpiresInSeconds = WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT;
   enablePageCache = WEB_ENABLEPAGECACHE_DEFAULT;
   enableSsl = WEB_ENABLESSL_DEFAULT;
   }
   else
   {
   dbConnectionString = ApplicationConfiguration.ReadSetting(settings, DATAACCESS_CONNECTIONSTRING, DATAACCESS_CONNECTIONSTRING_DEFAULT);
   pageCacheExpiresInSeconds = ApplicationConfiguration.ReadSetting(settings, WEB_PAGECACHEEXPIRESINSECONDS, WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT);
   enablePageCache = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLEPAGECACHE, WEB_ENABLEPAGECACHE_DEFAULT);
   enableSsl = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLESSL, WEB_ENABLESSL_DEFAULT);
   }
   
   return settings;
  }
   
  这里可以看到,Duwamish其实并没有自己手工从一个XmlNode里面读取数据,而是直接将数据转给一个NameValueSectionHandler做实际的配置读取,它自己所做的工作只是检查是否有实际定义的配置值,如果没有的话,就赋给默认值。

使用道具 举报

回复
论坛徽章:
8
12#
 楼主| 发表于 2007-1-15 16:46 | 只看该作者
总结:
   
  至此,web.config中的配置值就被读到了配置类的静态变量中,以后在程序的其它地方就可以使用配置类的静态变量来直接访问配置值了,例如,在程序的任何地方,只要输入Duwamish7.Common.DuwamishConfiguration.ConnectionString就可以得到:server=LUYAN\NetSDK;User ID=Duwamish7_login;Password=password;database=Duwamish7;Connection Reset=FALSE这个字符串。更为理想的是,你可以扩展自己的配置节和配置节处理程序,对比较复杂的自定义配置进行预处理。

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鸡
日期:2006-09-06 21:16:07生肖徽章:鸡
日期:2006-09-26 17:35:04生肖徽章:鸡
日期:2006-10-27 07:23:32金色在线徽章
日期:2007-01-03 04:01:42生肖徽章:鸡
日期:2007-01-25 16:58:43
13#
发表于 2007-1-18 21:35 | 只看该作者

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表