Duwamish深入剖析-配置篇

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&gt;
  4
  5<!-- Trace file settings -->
  6
  7dd key="SystemFramework.Tracing.Enabled" value="False" /&gt;
  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" /&gt;
 14
 15<!-- The TraceLevel for this switch. -->
 16
 17dd key="SystemFramework.Tracing.TraceLevel" value="4" /&gt;
 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" /&gt;
 24
 25<!-- This description of the Tracing.SwitchName switch -->
 26
 27dd key="SystemFramework.Tracing.SwitchDescription" value="Error and information tracing for Duwamish" /&gt;
 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" /&gt;
 38
 39dd key="SystemFramework.EventLog.Machine" value="." /&gt;
 40
 41dd key="SystemFramework.EventLog.SourceName" value="Duwamish7" /&gt;
 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" /&gt;
 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" /&gt;
 62
 63dd key="Duwamish.Web.EnablePageCache" value="True" /&gt;
 64
 65dd key="Duwamish.Web.PageCacheExpiresInSeconds" value="3600" /&gt;
 66
 67dd key="Duwamish.Web.EnableSsl" value="False" /&gt;
 68
 69</duwamishconfiguration>
 70<sourceviewer>
 71<!-- Valid directories for source browsing. Keep these lower case. -->
 72
 73dd key="." value=" " /&gt;
 74
 75dd key="modules" value=" " /&gt;
 76
 77dd key="..\common\data" value=" " /&gt;
 78
 79dd key="..\systemframework" value=" " /&gt;
 80
 81dd key="..\business\facade" value=" " /&gt;
 82
 83dd key="..\business\rules" value=" " /&gt;
 84
 85dd key="..\dataaccess" value=" " /&gt;
 86
 87dd key="secure" value=" " /&gt;
 88
 89dd key="docs\common" value=" " /&gt;
 90
 91dd key="docs\dataaccess" value=" " /&gt;
 92
 93dd key="docs\facade" value=" " /&gt;
 94
 95dd key="docs\rules" value=" " /&gt;
 96
 97dd key="docs\web" value=" " /&gt;
 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>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus