http://blog.csdn.net/maicar1235/archive/2008/08/22/2812552.aspx
一、 .NET反射工廠方法、
數據提供者應用程序接口DataProvider不僅是抽象數據庫訪問基類同時也是實例化具體數據庫的工廠。它提供了實例化具體數據庫訪問對象的工廠方法。DataProvider中的工廠方法是靜態過程Static viod CreateProvider()。這個工廠方法調用反射類中的CreateObject函數動態的生成實例對象。CreateObject有如下兩種重載形式: 1.DotNetNuke.Framework.Reflection.CreateObject(“data”);
2.DotNetNuke.Framework.Reflection.CreateObject(“data”,”Cross.DNN.Modules.CrossArticle.Data”, “Cross.DNN.Modules.CrossArticle”));
實現反射的關鍵是要提供所要創建實例的類型名稱。類型名稱(TypeName)由兩部分組成,第一部分是包含了完整名稱空間(namespace)的類名,第二部分是類所在的組件(Assembly)的名稱。上面的兩種重載形式對應著兩種獲得類型名稱的方法。
由於採用反射技術在運行時才知道要所要實例化的相關信息,因此這些信息不可以固化在程序中。DNN所採用的是在配置文件(web.config)中定義了數據提供者應用程序接口實現的配置信息,並提取這些信息到相應的類中。配置文件中針對不同的提供者模式定義了相應的節(section),如數據提供者模式所對應的節就是”data”。以下呈現的就是配置文件中”data”節的相關信息:
<!--[if !supportLists]-->1. <!--[endif]-->Section Handle:<section name=”data” type=”DotNetNuke.Framework.Providers.ProviderConfigurationHandler, DotNetNuke” />;
<!--[if !supportLists]-->2. <!--[endif]-->Section:
<data defaultProvider=”SqlDataProvider”>
<providers>
<clear />
<add name=”SqlDataProvider” type=”DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider” connectionStringName=”SiteSqlServer” upgradeConnectionString=”” providerPath=”~\Providers\DataProviders\SqlDataProvider\” objectQualifier=”” databaseOwner=”dbo” />
</providers>
</data>
Section Handle的作用一是標明了具體配置節(section)的名稱;二是在type屬性中提供了提取配置信息對象的類型名稱,即位於DotNetNuke.Framework.Providers 名稱空間下的ProviderConfigurationHandler 類,它所屬於的組件名稱是DotNetNuke 。該類實現了IconfigurationSectionHandler接口返回ProviderConfiguration 對象,ProviderConfiguration 類中有兩個重要的屬性:DefaultProvider和Providers屬性,即對應著data節中的內容。其中DefaultProvider屬性的類型是字符串,存儲了<data>節defaultProvider屬性值;Providers屬性的類型是哈希表(hashtable),存儲了<providers>下子節<add>的信息,hashtable的數據結構是名/值對,其名稱對應著<add>節屬性name的值,值則對應著<add>節所有屬性名/值對構成的屬性集合即XmlAttributeCollection數據類型。這個類型的對象是作為Provider類構造函數的參數實例化Provider對象的。Provider對象提供了三個屬性:Name,Type,Attributes分別對應著<add>節中的name屬性值,type屬性值,以及其它屬性名/值對構成的集合即NameValueCollection對象。具體的數據庫訪問類就是通過Provider類的Attributes屬性獲得數據庫信息的。
在Reflection類中用第一種方法生成對象時,首先將參數”data”傳遞給函數ConfigurationSettings.GetConfig,這個.NET自帶的靜態函數根據參數”data”在web.config中定位到相應的Section Handle並調用這個Section Handle返回ProviderConfiguration對象objProviderConfiguration。然後將objProviderConfiguration.Providers(objProviderConfiguration.DefaultProvider)作為構造函數的參數實例化一個Provider對象。所要生成的對象的類型名稱即由Provider對象的Type屬性提供。
第二種方法獲得ProviderConfiguration對象的過程和第一種方法相同。然後將第二和第三個參數分別加上後綴字符串ProviderConfiguration對象的DefaultProvider屬性值構成所要生成的對象的類型名稱。這種方法用於實例化DNN模塊的具體數據庫訪問類。由於DNN模塊可由第三方開發,模塊的名稱空間和組件名稱等可以自定義,不可能針對每一個自定義模塊都在web.config中定義與其相關的配置信息。因此採用第二種方法,只要把自定義的名稱空間和組件名稱作為參數傳遞給反射工廠方法即可得到需要實例化的類型名稱。而DNN系統的核心功能模塊則採用第一種方法。
Reflection類除了從配置文件提取信息獲得類型名稱並創建相應的實例外,還將這個實例放入緩存Cache中以提高系統性能。如果不採用反射技術,只使用一般的工廠方法。當新增一個數據庫類型時就要新增一個具體工廠,從而需要重新編譯主程序,降低了應用程序的可維護性。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/maicar1235/archive/2008/08/22/2812552.aspx
浙公网安备 33010602011771号