Duwamish深入剖析-配置篇
摘要:
本文详细介绍了Duwamish网上电子书店的Web.config配置文件的结构处理方式以及用途,阐述了配置文件的各功能模块中的作用。
目录:
引言
配置节处理程序声明
自定义配置节
配置节处理程序
总结
参考资料
作者
引言:
几乎在每本介绍Asp.Net编程的书里,在谈到如何管理数据库连接字符串的时候,都是采用将数据库连接字符串以如下形式放在Web.Config文件中:
ppSettings>
dd key="ConnectionString" value="data source=localhost;initial catalog=Database;user id=;password="/> 然后在程序中采用以下方式访问:
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的管理和支持,所以它应该放在一个虚拟目录下,我们先来看看它的第一部分:
1<configsections>
2<section name="ApplicationConfiguration" type="Duwamish7.SystemFramework.ApplicationConfiguration, Duwamish7.SystemFramework"></section>
3<section name="DuwamishConfiguration" type="Duwamish7.Common.DuwamishConfiguration, Duwamish7.Common"></section>
4<section name="SourceViewer" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"></section> </configsections>
这里定义了三个配置节处理程序声明(Section),按照规定它们必须出现在配置文件顶部
1<configsections> 和 </configsections>
标记之间,在这里,它们只用到了name和type属性,其中,name属性定义了指定配置节的名称,而type属性则规定了指定从配置文件中读取节的配置节处理程序类的名称,有两个部分,前面为处理程序的类名,后面为Assembly名(Assembly必须位于bin目录中)以及版本号,公匙等信息。
他们具体表示什么意思呢?比如第一个section,意思就是告诉Asp.Net系统,当在程序中使用System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration")这个静态方法来读取ApplicationConfiguration配置节的时候,会调用Duwamish7.SystemFramework.ApplicationConfiguration这个类来对这个配置节进行处理。关于配置节处理类,我们会在后面详细讨论,我们先继续往下看web.config文件。
自定义配置节
在
1<system.web>节点之后,我们可以看见以下的XML元素(关于system.web节点的说明已经有大量文章介绍,这里不再重复):
2
3pplicationConfiguration>
4
5<!-- Trace file settings -->
6
7dd key="SystemFramework.Tracing.Enabled" value="False" />
8
9<!-- Set this to the file with the trace settings. This file should be relative
10
11to the root application directory. -->
12
13dd key="SystemFramework.Tracing.TraceFile" value="DuwamishTrace.txt" />
14
15<!-- The TraceLevel for this switch. -->
16
17dd key="SystemFramework.Tracing.TraceLevel" value="4" />
18
19<!-- This switch name. The trace level for this name can be set through
20
21environment variables or the registry -->
22
23dd key="SystemFramework.Tracing.SwitchName" value="DuwamishTraceSwitch" />
24
25<!-- This description of the Tracing.SwitchName switch -->
26
27dd key="SystemFramework.Tracing.SwitchDescription" value="Error and information tracing for Duwamish" />
28
29<!-- Event log settings
30
31Note: 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
32
33that event source must exist.
34
35\-->
36
37dd key="SystemFramework.EventLog.Enabled" value="True" />
38
39dd key="SystemFramework.EventLog.Machine" value="." />
40
41dd key="SystemFramework.EventLog.SourceName" value="Duwamish7" />
42
43<!-- Use the standard TraceLevel values:
44
450 = Off
46
471 = Error
48
492 = Warning
50
513 = Info
52
534 = Verbose -->
54
55dd key="SystemFramework.EventLog.LogLevel" value="1" />
56
57
58<duwamishconfiguration>
59<!-- Settings specific to the Duwamish application -->
60
61dd key="Duwamish.DataAccess.ConnectionString" value="server=LUYAN\NetSDK;User ID=Duwamish7_login;Password=password;database=Duwamish7;Connection Reset=FALSE" />
62
63dd key="Duwamish.Web.EnablePageCache" value="True" />
64
65dd key="Duwamish.Web.PageCacheExpiresInSeconds" value="3600" />
66
67dd key="Duwamish.Web.EnableSsl" value="False" />
68
69</duwamishconfiguration>
70<sourceviewer>
71<!-- Valid directories for source browsing. Keep these lower case. -->
72
73dd key="." value=" " />
74
75dd key="modules" value=" " />
76
77dd key="..\common\data" value=" " />
78
79dd key="..\systemframework" value=" " />
80
81dd key="..\business\facade" value=" " />
82
83dd key="..\business\rules" value=" " />
84
85dd key="..\dataaccess" value=" " />
86
87dd key="secure" value=" " />
88
89dd key="docs\common" value=" " />
90
91dd key="docs\dataaccess" value=" " />
92
93dd key="docs\facade" value=" " />
94
95dd key="docs\rules" value=" " />
96
97dd key="docs\web" value=" " />
98
99</sourceviewer>
100
101配置节信息分为两个主区域:配置节处理程序声明区域和配置节设置区域,这里就是刚才定义的三个section的配置节设置区域,它包含实际的配置设置,其用途说明请参见注释,所有配置信息都必须驻留在 <configuration> 和 </configuration> 根 XML 标记之间,配置节设置区域位于 <configsections> 区域之后。
102
103* * *
104
105配置节处理程序
106
107前面已经介绍了,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的处理类调用流程:
108
1091、在global.asax的Application_OnStart方法里面调用ApplicationConfiguration.OnApplicationStart静态方法,并获得应用程序根的绝对路径。
110
111
112 void Application_OnStart()
113 {
114 ApplicationConfiguration.OnApplicationStart(Context.Server.MapPath( Context.Request.ApplicationPath));
115 string configPath = Path.Combine(Context.Server.MapPath( Context.Request.ApplicationPath ),
116 "remotingclient.cfg");
117 if(File.Exists(configPath))
118 RemotingConfiguration.Configure(configPath);
119 }
120
121
122
1232、ApplicationConfiguration.OnApplicationStart静态方法里调用System.Configuration.ConfigurationSettings.GetConfig方法处理配置节:
124
125
126 public static void OnApplicationStart(String myAppPath)
127 {
128 appRoot = myAppPath;
129 System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration");
130 System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration");
131 System.Configuration.ConfigurationSettings.GetConfig("SourceViewer");
132 }
133
134
135大家已经注意到了,Duwamish并没有获取GetConfig返回的值,因为前面已经说过,GetConfig方法会引发配置节处理程序的Create方法,所以,只需要在Create方法中将配置值取出来就行了。
136
1373、配置读取示例:Duwamish7.Common.DuwamishConfiguration类
138
139
140 public Object Create(Object parent, object configContext, XmlNode section)
141 {
142
143 NameValueCollection settings;
144
145 try
146 {
147 NameValueSectionHandler baseHandler = new NameValueSectionHandler();
148 settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
149 }
150 catch
151 {
152 settings = null;
153 }
154
155 if ( settings == null )
156 {
157 dbConnectionString = DATAACCESS_CONNECTIONSTRING_DEFAULT;
158 pageCacheExpiresInSeconds = WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT;
159 enablePageCache = WEB_ENABLEPAGECACHE_DEFAULT;
160 enableSsl = WEB_ENABLESSL_DEFAULT;
161 }
162 else
163 {
164 dbConnectionString = ApplicationConfiguration.ReadSetting(settings,
165 DATAACCESS_CONNECTIONSTRING, DATAACCESS_CONNECTIONSTRING_DEFAULT);
166 pageCacheExpiresInSeconds =
167 ApplicationConfiguration.ReadSetting(settings, WEB_PAGECACHEEXPIRESINSECONDS,
168 WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT);
169 enablePageCache = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLEPAGECACHE,
170 WEB_ENABLEPAGECACHE_DEFAULT);
171 enableSsl = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLESSL, WEB_ENABLESSL_DEFAULT);
172 }
173
174 return settings;
175 }
176
177
178这里可以看到,Duwamish其实并没有自己手工从一个XmlNode里面读取数据,而是直接将数据转给一个NameValueSectionHandler做实际的配置读取,它自己所做的工作只是检查是否有实际定义的配置值,如果没有的话,就赋给默认值。
179
180* * *
181
182总结:
183
184至此,web.config中的配置值就被读到了配置类的静态变量中,以后在程序的其它地方就可以使用配置类的静态变量来直接访问配置值了,例如,在程序的任何地方,只要输入Duwamish7.Common.DuwamishConfiguration.ConnectionString就可以得到:server=LUYAN\NetSDK;User ID=Duwamish7_login;Password=password;database=Duwamish7;Connection Reset=FALSE这个字符串。更为理想的是,你可以扩展自己的配置节和配置节处理程序,对比较复杂的自定义配置进行预处理。
185
186* * *
187
188参考资料:
189
190ASP.NET 配置
191
192ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconaspnetconfiguration.htm
193
194配置文件架构
195
196ms-help://MS.NETFrameworkSDK.CHS/cpgenref/html/gngrfnetframeworkconfigurationfileschema.htm</configsections></system.web>