Duwamish深入剖析-配置篇

摘要:
本文详细介绍了Duwamish网上电子书店的Web.config配置文件的结构处理方式以及用途,阐述了配置文件的各功能模块中的作用。

目录:
引言
配置节处理程序声明
自定义配置节
配置节处理程序
总结
参考资料
作者

引言:
几乎在每本介绍Asp.Net编程的书里,在谈到如何管理数据库连接字符串的时候,都是采用将数据库连接字符串以如下形式放在Web.Config文件中:
ppSettings>
dd key="ConnectionString" value="data source=localhost;initial catalog=Database;user id=;password="/>
</appSettings>
然后在程序中采用以下方式访问:
System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]
这样做的好处非常明显:当数据库有变动的时候,只需要改变web.config中的连接字符串,而不需要重新编译整个应用程序,给应用的部署和移植带来非常大的方便。
如果你以为web.config的作用仅限于此的话,那你就错了,web.config的配置功能非常强大,它可以支持使用自己的 XML 配置标记扩展标准的 ASP.NET 配置设置集,在Duwamish中一定程度上的体现了它的功能,下面我将要详细分析Duwamish的web.config文件,让大家能了解到开发一个典型的.Net WEB应用程序的配置技术。

配置节处理程序声明
在Duwamish解决方案中,Web.config文件是放在WEB项目下,因为web.config需要IIS和Asp.Net Runtime的管理和支持,所以它应该放在一个虚拟目录下,我们先来看看它的第一部分:
<configSections>
<section name="ApplicationConfiguration" type="Duwamish7.SystemFramework.ApplicationConfiguration, Duwamish7.SystemFramework" />
<section name="DuwamishConfiguration" type="Duwamish7.Common.DuwamishConfiguration, Duwamish7.Common" />
<section name="SourceViewer" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
这里定义了三个配置节处理程序声明(Section),按照规定它们必须出现在配置文件顶部 <configSections> 和 </configSections> 标记之间,在这里,它们只用到了name和type属性,其中,name属性定义了指定配置节的名称,而type属性则规定了指定从配置文件中读取节的配置节处理程序类的名称,有两个部分,前面为处理程序的类名,后面为Assembly名(Assembly必须位于bin目录中)以及版本号,公匙等信息。
他们具体表示什么意思呢?比如第一个section,意思就是告诉Asp.Net系统,当在程序中使用System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration")这个静态方法来读取ApplicationConfiguration配置节的时候,会调用Duwamish7.SystemFramework.ApplicationConfiguration这个类来对这个配置节进行处理。关于配置节处理类,我们会在后面详细讨论,我们先继续往下看web.config文件。

自定义配置节
在<system.web>节点之后,我们可以看见以下的XML元素(关于system.web节点的说明已经有大量文章介绍,这里不再重复):
pplicationConfiguration>
<!-- Trace file settings -->
dd key="SystemFramework.Tracing.Enabled" value="False" />
<!-- Set this to the file with the trace settings. This file should be relative
to the root application directory. -->
dd key="SystemFramework.Tracing.TraceFile" value="DuwamishTrace.txt" />
<!-- The TraceLevel for this switch. -->
dd key="SystemFramework.Tracing.TraceLevel" value="4" />
<!-- This switch name. The trace level for this name can be set through
environment variables or the registry -->
dd key="SystemFramework.Tracing.SwitchName" value="DuwamishTraceSwitch" />
<!-- This description of the Tracing.SwitchName switch -->
dd key="SystemFramework.Tracing.SwitchDescription" value="Error and information tracing for Duwamish" />
<!-- Event log settings
Note: The default Duwamish7 event source name is created in the local machine during setup. If you wish to log events to a different event source
that event source must exist.
-->
dd key="SystemFramework.EventLog.Enabled" value="True" />
dd key="SystemFramework.EventLog.Machine" value="." />
dd key="SystemFramework.EventLog.SourceName" value="Duwamish7" />
<!-- Use the standard TraceLevel values:
0 = Off
1 = Error
2 = Warning
3 = Info
4 = Verbose -->
dd key="SystemFramework.EventLog.LogLevel" value="1" />
</ApplicationConfiguration>
<DuwamishConfiguration>
<!-- Settings specific to the Duwamish application -->
dd key="Duwamish.DataAccess.ConnectionString" value="server=LUYAN\NetSDK;User ID=Duwamish7_login;Password=password;database=Duwamish7;Connection Reset=FALSE" />
dd key="Duwamish.Web.EnablePageCache" value="True" />
dd key="Duwamish.Web.PageCacheExpiresInSeconds" value="3600" />
dd key="Duwamish.Web.EnableSsl" value="False" />
</DuwamishConfiguration>
<SourceViewer>
<!-- Valid directories for source browsing. Keep these lower case. -->
dd key="." value=" " />
dd key="modules" value=" " />
dd key="..\common\data" value=" " />
dd key="..\systemframework" value=" " />
dd key="..\business\facade" value=" " />
dd key="..\business\rules" value=" " />
dd key="..\dataaccess" value=" " />
dd key="secure" value=" " />
dd key="docs\common" value=" " />
dd key="docs\dataaccess" value=" " />
dd key="docs\facade" value=" " />
dd key="docs\rules" value=" " />
dd key="docs\web" value=" " />
</SourceViewer>
配置节信息分为两个主区域:配置节处理程序声明区域和配置节设置区域,这里就是刚才定义的三个section的配置节设置区域,它包含实际的配置设置,其用途说明请参见注释,所有配置信息都必须驻留在 <configuration> 和 </configuration> 根 XML 标记之间,配置节设置区域位于 <configSections> 区域之后。

配置节处理程序
前面已经介绍了,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做实际的配置读取,它自己所做的工作只是检查是否有实际定义的配置值,如果没有的话,就赋给默认值。

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

参考资料:
ASP.NET 配置
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconaspnetconfiguration.htm
配置文件架构
ms-help://MS.NETFrameworkSDK.CHS/cpgenref/html/gngrfnetframeworkconfigurationfileschema.htm

作者:卢彦

版权声明

凡在本网站发表的文章,作者必须保证是原创文章;如果不是原创文章,由此带来的版权纠纷由作者自己承担。微软有义务对本站点发表的文章进行审核,但您需要考虑这些文章的使用风险。本站点仅提供一个用户相互交换技术信息和学习的园地,并不对来自社区用户的技术文章承担任何风险。

Duwamish深入剖析-配置篇相关推荐

  1. VMware View 5.0从菜鸟到高手系列 10 –远程图形工作站配置篇

    本文档依照PCoIP设备供应商丽台(Leadtek)提供的零客户机VP200P以及PCoI卡VP200H为例,为了介绍整个安装步骤.以下配置在VMware view 4.5中安装,但在更新的版本中如V ...

  2. amd860k能装黑苹果吗_黑苹果配置 篇六:黑苹果硬件选购指南之终篇--2019年8月

    黑苹果配置 篇六:黑苹果硬件选购指南之终篇--2019年8月 2019-08-17 17:31:38 26点赞 238收藏 33评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最 ...

  3. idea配置jfinal_intellij idea安装与配置(Java开发配置篇)

    一.maven配置 在configure->settings的搜索框中输入maven,然后入下图所示,修改maven主目录.maven配置文件.maven本地仓库地址 二.SVN设置 在搜索框中 ...

  4. [ webpack4 ] 配置属于自己的打包系统教程(最终篇)—— 环境配置篇

    GitHub 完整配置文件地址: https://github.com/yhtx1997/w... 由于篇幅过长分三次发布,建议按顺序看 [ webpack4 ] 配置属于自己的打包系统教程(一)-- ...

  5. 查询优化器内核剖析第一篇

    查询优化器内核剖析第一篇 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计划的缓存 & Hint提示 查 ...

  6. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

    转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问 对于可以静态化的页面,尽可能静态化 对一个动态页面中可以静态的局部,采用静态化 部分数据可以生成XML,或者文 ...

  7. 宝塔:ShopXO开源商城(如何二级域名访问)- 配置篇

    宝塔:ShopXO开源商城(如何二级域名访问)- 配置篇 步骤: 登陆宝塔后台,软件商店–> shopxo --> 一键部署 -->输入二级域名的目录配置信息(比如:二级域名.sho ...

  8. phpcmsV9 会员升级 - 配置篇

    效果截图: 配置教程: 参考文章:点击查看 以上就是关于"phpcmsV9 会员升级 - 配置篇" 的全部内容.

  9. maven配置篇之pom.xml

    maven 配置篇 之pom.xml 说完了settings.xml配置,下来说一下maven2的主要配置pom.xml 什么是pom?     pom作为项目对象模型.通过xml表示maven项目, ...

最新文章

  1. A、B、C、D、E类IP地址都是怎么划分的?
  2. 【AI基础】OpenCV,PIL,Skimage你pick谁
  3. ios开发人员mac空间不够用的解决办法
  4. sql字符串分隔函数
  5. “报复黑客”:可行的战略还是重大的风险?
  6. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
  7. 计算机相关专业的自我评价,计算机相关专业的学生自我评价
  8. 通信与计算机技术的联系,通信技术与计算机技术融合发展论文
  9. mysql less6教程_Sqli labs系列-less-56 报错注入法(上)
  10. Linux文件系统之:通用块处理层 ll_rw_block | +往期文章回顾
  11. python爬取qq音乐周杰伦首页歌词
  12. Atitit 软件与互联网理论 attilax总结
  13. merge()函数--R语言
  14. MySQL命令行乱码问题的解决
  15. 安徽省2019c语言二级答案,2019年全国计算机二级C语言练习及答案二
  16. Google Earth Engine个人笔记:2 计算植被覆盖度
  17. 面试经历---广州YY(欢聚时代)
  18. 微信小程序ssm电影院购票+后台管理系统|前后分离VUE
  19. 数数(数学题运算分配律)
  20. android的手机壳,神奇手机壳 苹果安卓能共存了!

热门文章

  1. 在kubernetes集群中部署mysql主从
  2. [BZOJ1187]神奇游乐园(插头DP)
  3. (八)流程控制 for标签和if标签
  4. 来一场说聊就聊的压测分享
  5. 检查IP是否可用的方法
  6. 庖丁解牛迭代器,聊聊那些藏在幕后的秘密 1
  7. 力扣算法题—073矩阵置零
  8. Maven配置JRE版本
  9. 记《浪潮之巅》-第一版-12.短暂的春秋--与机会失之交臂的公司之一太阳公司(sun microsystems)...
  10. 2013:奇虎360最好的时光