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 relativeto 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 throughenvironment 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 settingsNote: The default Duwamish7 event source name is created in the local machine during setup. If you wish to log events to a different event sourcethat 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 = Off1 = Error2 = Warning3 = Info4 = 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這個字串。更為理想的是,你可以擴充自己的配置節和配置節處理常式,對比較複雜的自訂配置進行預先處理。