您的位置:首页 > 其它

Duwamish深入剖析-配置篇

2007-11-12 07:57 337 查看
微软社区

摘要:

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

------------------------------------------------------------------------

目录:

引言

配置节处理程序声明

自定义配置节

配置节处理程序

总结

参考资料

作者

------------------------------------------------------------------------
--------

引言:

几乎在每本介绍Asp.Net编程的书里,在谈到如何管理数据库连接字符串的时候,
都是采用将数据库连接字符串以如下形式放在Web.Config文件中

< appSettings>

< add 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节点的
说明已经有大量文章介绍,这里不再重复):

<ApplicationConfiguration>
<!-- Trace file settings -->
<add 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. -->
<add key="SystemFramework.Tracing.TraceFile" value="DuwamishTrace.
txt" />
<!-- The TraceLevel for this switch. -->
<add key="SystemFramework.Tracing.TraceLevel" value="4" />
<!-- This switch name. The trace level for this name can be set
through
environment variables or the registry -->
<add key="SystemFramework.Tracing.SwitchName"
value="DuwamishTraceSwitch" />
<!-- This description of the Tracing.SwitchName switch -->
<add 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.
-->
<add key="SystemFramework.EventLog.Enabled" value="True" />
<add key="SystemFramework.EventLog.Machine" value="." />
<add key="SystemFramework.EventLog.SourceName" value="Duwamish7"
/>
<!-- Use the standard TraceLevel values:
0 = Off
1 = Error
2 = Warning
3 = Info
4 = Verbose -->
<add key="SystemFramework.EventLog.LogLevel" value="1" />
</ApplicationConfiguration>
<DuwamishConfiguration>
<!-- Settings specific to the Duwamish application -->
<add key="Duwamish.DataAccess.ConnectionString"
value="server=LUYAN/NetSDK;User ID=Duwamish7_login;Password=password;
database=Duwamish7;Connection Reset=FALSE" />
<add key="Duwamish.Web.EnablePageCache" value="True" />
<add key="Duwamish.Web.PageCacheExpiresInSeconds" value="3600" />
<add key="Duwamish.Web.EnableSsl" value="False" />
</DuwamishConfiguration>
<SourceViewer>
<!-- Valid directories for source browsing. Keep these lower case.
-->
<add key="." value=" " />
<add key="modules" value=" " />
<add key="../common/data" value=" " />
<add key="../systemframework" value=" " />
<add key="../business/facade" value=" " />
<add key="../business/rules" value=" " />
<add key="../dataaccess" value=" " />
<add key="secure" value=" " />
<add key="docs/common" value=" " />
<add key="docs/dataaccess" value=" " />
<add key="docs/facade" value=" " />
<add key="docs/rules" value=" " />
<add 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

------------------------------------------------------------------------
--------

作者:卢彦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: