分享
 
 
 

Duwamish深入剖析-配置篇

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

摘要:

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有