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