Oxite分析(记录)
二、OixteSite項目中Global.asax文件中的Application_Start和Application_End方法
查看OxiteSite項目的Global.asax文件,發現其實現代碼在Oxite項目的OxiteApplication類中。在Application_Start方法中對OxiteSite進行了初始化工作。
Application_Start方法具體做了哪些事呢?
一是設置依賴注入容器并將之存入應用程序狀態中(HttpApplicationState)
二是根據配置加載模塊 Oxite中使用的依賴注入容器為Unity(詳見Enterprise Library 4.0以上版本)。
setupContainer方法設置注入容器并返回一個UnityContainer對象,保存為Application["container"]。稍后將仔細分析該方法。
Application["bootStrappersLoaded"]用于標認初始化是否完成。
load()方法調用靜態方法Load(HttpContextBase context)。作用是根據配置加載指定模塊(Module)。
Application_End方法調用unload()方法。在應用程序結束時,完成某些模塊的清理工作。
三、setupContainer方法
預備知識:Unity (IOC/DI)、自定義web.config配置結點
通過setupContainer方法的方法名不難看出是用于設置依賴注入容器的。
在setupContainer方法中,首先定義一個IUnityContainer變量parentContainer: 首先,將幾個基礎對象注冊為單例: parentContainer .RegisterInstance((OxiteConfigurationSection)ConfigurationManager.GetSection("oxite")) .RegisterInstance(new AppSettingsHelper(ConfigurationManager.AppSettings)) .RegisterInstance(RouteTable.Routes) .RegisterInstance(System.Web.Mvc.ModelBinders.Binders) .RegisterInstance(ViewEngines.Engines) .RegisterInstance(HostingEnvironment.VirtualPathProvider);
OxiteConfigurationSection類,自定義配置節點。其定義位與Oxite.Configuration命名空間下。是Oxite中實現模塊化的配置文件。配置的結點單獨放在OxiteSite項目下的oxite.config文件中。
AppSettingsHelper 類對ConfigurationManager.AppSettings 進行包裝, 提供幾個讀取方法GetInt32、GetString等,用于讀取web.config文件中的appSettings節點下的值。其實完全可以將這幾個讀取方法放入NameValueCollectionExtensions類(Oxite.Extensions命名空間下)。不過后來想了想,這里用AppSettingsHelper命名其實也可以明確該類的目的就是為了操作AppSettings結點。
RouteTable.Routes靜態屬性返回一個RouteCollection靜態對象。RouteCollection類在System.Web.Routing程序集中定義。用于保存URL路由設置。 注入容器的目的是為了單元測試。
ModelBinders.Binders靜態屬性返回一個ModelBinderDictionary靜態對象。用于處理數據綁定相關操作(獲取表單、查詢數據并轉換;生成URL路徑)。
ViewEngines.Engines靜態屬性返回一個ViewEngineCollection靜態對象。用于視圖引擎方面。
HostingEnvironment.VirtualPathProvider靜態屬性返回一個VirtualPathProvider靜態對象。個人猜測可能會用在自定義ViewEngine中,不過目前Oxite版本中好像還沒地方用,注釋掉也沒地方報錯。
RouteTable.Routes、ModelBinders.Binders和ViewEngines.Engines是ASP.NET MVC底層比較基礎性的屬性或對象。值得花時間單獨去學習。
接著,將web.config中的connectionStrings和自定義節點“oxite”(oxite.config文件)下的connectionStrings注冊為單件。 foreach (ConnectionStringSettings connectionString in ConfigurationManager.ConnectionStrings) parentContainer.RegisterInstance(connectionString. Name, connectionString.ConnectionString); foreach (ConnectionStringSettings connectionString in parentContainer.Resolve<OxiteConfigurationSection>().ConnectionStrings) parentContainer.RegisterInstance(connectionString. Name, connectionString.ConnectionString);
疑問1:在運行時,站點不重啟的情況下,如果oxite結點下的connectionStrings改變后,要怎樣才能更新到依賴注入容器?這里的處理似乎欠妥。 后來我到Oxite.codeplex.com去問了,Oxite項目組的ErikPorter說目前得重啟站點才行。希望他們盡快修正,不然所謂的模塊熱插拔會大打折扣。
接著看setupContainer方法: LoadModules類和LoadBackgroundServices類位于Oxite.BootStrapperTasks命名空間。從類命名上看,一個是和加載模塊相關的,另一個是和加載后臺服務相關的,具體是什么得往后細看了。兩者都實現了Oxite.Infrastructure命名空間下的IBootStrapperTask接口。IBootStrapperTask就兩個方法:Execute和Clearup。IBootStrapperTask我覺得可以直譯為引導程序接口,其實例可以稱為引導程序。
在這里我們只需要知道,Modules實例和LoadBackgroundSercies實例分別注冊為單件。
接著看setupContainer方法中將一些類型也注冊到依賴注入容器中,除了幾個自定義生命周期的類型外,其他的都只是簡單的映射,這里就不多說了。
在setupContainer結束返回值之前,會將web.config文件中Unity配置結點注冊入容器中。如果配置結點和我們硬編碼中的設置重復,則會覆蓋硬編碼中的配置。這一特性非常有用,它允許我們在使用程序的默認配置的同時,又提供了一個接口以供我們替換。詳情可以查看相關Unity方面的資料。
轉載于:https://www.cnblogs.com/jianshao810/archive/2010/05/18/1738511.html
總結
以上是生活随笔為你收集整理的Oxite分析(记录)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比亚迪汽车王朝网(萍乡盛世开元4S店)+
- 下一篇: 长泰八挡变速箱怎么换油?