Duwamish深入剖析-配置篇

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这个字符串。更为理想的是,你可以扩展自己的配置节和配置节处理程序,对比较复杂的自定义配置进行预处理。

时间: 2024-10-23 08:05:27

Duwamish深入剖析-配置篇的相关文章

Home Lab家庭实验室搭建之网络配置篇

本文讲的是Home Lab家庭实验室搭建之网络配置篇,在本文中,我将介绍构建网络的基本设置,这是一个简单的平面化网络,处于作为防火墙,NAT,DHCP和VPN的路由器的后面. 第一个操作是创建一个虚拟交换机,该平面网络中的所有虚拟机都将连接到该虚拟交换机. 几乎所有的虚拟解决方案都支持在一个名称或另一个名称下配置虚拟交换机.由于我为我的家庭实验室选择了ESXi,下文中所显示的命令都是用于此平台的命令,但一般来说,你可以使用Hyper-V或XenServer完成相同的操作. 我通过命令行显示所有步

【Windows10&amp;nbsp;IoT开发系列】配置篇

原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry Pi.MinnowBoard和Galileo平台上的核心版.本文重点针对Raspberry Pi平台的Windwos10 IoT配置做介绍. Windows 10 IoT Editions ​一:设置你的电脑. 注:​开发Windows10 IoT的电脑需要Visual Studio 2015.

SharePoint 2013 工作流之年假审批Designer配置篇

原文:SharePoint 2013 工作流之年假审批Designer配置篇 本文介绍SharePoint 2013 使用Designer工具,设计年假审批工作流,由于流程所用的条件和操作都比较简单,所以演示为主,最后附流程图和流程的文本图,有兴趣的可以参照实验.如果对于Designer设计工作流的方法不是很熟悉,可以参见本博客的其他文章. 1.新建请假申请列表,创建一张请假申请表,如下图: 2.选中请假申请表,点击工作流: 3.在工作流页面,选中启动工作流: 4.回到列表页,发现工作流已经启动

linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c   July  二零一一年一月六日 ----------------------------------------- 博主声明:1.本系列非linux系统教程,仅仅是针对linux0.11内核源码,所做的剖析,注释.2.本系列参考:深入理解linux内核.linux内核完全注释,linux内核源代码情景分析

thinkPHP学习笔记之安装配置篇

 这篇文章主要介绍了一款国产MVC框架thinkPHP,这里讲诉的是thinkphp的安装与配置,以及一个简单实例,有需要的小伙伴可以参考下.     国产框架thinkPHP,是一款MVC框架,这个框架最初模拟JAVA的struts框架,使用单一入口文件模拟JAVA的过滤器,使用action来模拟STRUTS的控制器ACTION,所以为什么他的MVC之中,M是model,V是view,而control却是action的原因. 在3.2.3版本中,control改成了C,也是趋于形式,因为JAV

Hexo折腾记——基本配置篇

前言 人闲起来真是可怕,本来已经折腾过了jekyll和Ghost,静态和动态博客也都尝了遍鲜,然而还是按捺不住寂寞又折腾起来Hexo.话说我最早大概是两年前高考结束的时候知道的Hexo,那时在家里没事干想搭个博客玩,然后看见了jekyll和hexo,无奈那时候就一台windows,啥也不懂啥也不会,这两个博客工具楞是装不上去.而Jekyll的一个好处是可以不用在本地跑,Github 的Pages功能原生支持Jekyll,所以我只需要下载些别人的源文件,自己随便修改下,传到Github就能在线调试

菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是"牛之鼻",只要能理清main函数,就一定能理解其中的奥秘,下面我们就一起来研究一下nginx的main函数. 1.nginx的main函数解读 nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件中,其源代码解析如下,涉及到的数据结构在本节仅指出其作用,将在第二节中详细解释. nginx main函数的流

NET下RabbitMQ实践 [配置篇]

这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AM

一起谈.NET技术,NET下RabbitMQ实践 [配置篇]

     这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况.      介绍:      rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器.      RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路