|
介紹
ASP.NET MVC3 的一個(gè)重要的新特性就是允許注冊(cè)一個(gè)服務(wù)點(diǎn) Service Location,然后在框架中使用的能力。以前版本的 MVC 已經(jīng)提供了 Service Location 和依賴注入的機(jī)會(huì),在 MVC3 中,我們正式提供了這種能力,并且為開發(fā)者開放了多種使用的機(jī)會(huì)。
總體策略
關(guān)于 Service Location 的最重要的部分就是它是可選的,這意味著如果你對(duì) Service Location 不感興趣,那么,你不需要被強(qiáng)制使用,你總是可以在不使用 Service Location 的情況下,調(diào)用自定義的函數(shù)。在以后加入新的 Service Location 的時(shí)候,也會(huì)保持向后的兼容性。
當(dāng)使用注冊(cè)的 Service Location 的時(shí)候,依賴于具體的使用,MVC 一般將會(huì)使用下面三種策略之一:
1. 定位一個(gè)唯一的注冊(cè)服務(wù)
現(xiàn)在的 MVC 中使用的許多服務(wù)都注冊(cè)一個(gè)實(shí)例來(lái)提供服務(wù),例如,控制器工廠 Controller Factory,它實(shí)現(xiàn)了接口 IControllerFactory。對(duì)于整個(gè)應(yīng)用來(lái)說(shuō),只有一個(gè)控制器工廠實(shí)例。
當(dāng) MVC 試圖使用單個(gè)的注冊(cè)服務(wù)的時(shí)候,它將會(huì)首先通過(guò) Service Locator 尋找時(shí)候存在一個(gè)注冊(cè)的服務(wù)實(shí)例,如果有,將使用這個(gè)服務(wù)實(shí)例,如果沒(méi)有,那么將會(huì)回退到?jīng)]有使用服務(wù)定位器時(shí)候注冊(cè)的單個(gè)實(shí)例。
上面的處理順序意味著使用服務(wù)定位器的用戶不必?fù)?dān)心現(xiàn)存項(xiàng)目中 MVC 的默認(rèn)服務(wù)。因?yàn)楫?dāng)服務(wù)提供器不存在的時(shí)候,將會(huì)自動(dòng)使用原來(lái)注冊(cè)的服務(wù),這種潛力也意味著可以在兩個(gè)地方注冊(cè)自定義的服務(wù),但是只有通過(guò)服務(wù)器注冊(cè)的服務(wù)被使用。
2. 定位多個(gè)注冊(cè)的服務(wù)
在 MVC 中也有為一個(gè)服務(wù)注冊(cè)多個(gè)服務(wù)實(shí)例的地方,比如說(shuō),視圖引擎,視圖引擎實(shí)現(xiàn)了接口 IViewEngine,典型情況下,MVC 提供了注冊(cè)多個(gè)服務(wù)的注冊(cè)點(diǎn),也提供了 ViewEngines.Engines 來(lái)找到每一個(gè)視圖引擎,并確定其中之一可以提供服務(wù)。還有其他的類似的場(chǎng)合,比如, ModelValidatorProviders.Providers 。
當(dāng) MVC 試圖使用這種具有多個(gè)服務(wù)實(shí)例的服務(wù)的時(shí)候,MVC 將會(huì)通過(guò)管理多個(gè)服務(wù)實(shí)現(xiàn)的 Facade 來(lái)完成,F(xiàn)acade 將會(huì)把通過(guò)靜態(tài)注冊(cè)的服務(wù)實(shí)例和通過(guò) Service Location 注冊(cè)的服務(wù)實(shí)例結(jié)合在一起來(lái)選擇合適的實(shí)現(xiàn)。在這里,服務(wù)的順序是很重要的,通常意味著通過(guò) Service Location 注冊(cè)的服務(wù)實(shí)例要優(yōu)先靜態(tài)注冊(cè)的實(shí)例。
類似于單實(shí)例服務(wù)注冊(cè),這意味著對(duì)于存在默認(rèn)服務(wù)提供器的時(shí)候,不需要再通過(guò) Service Location 來(lái)注冊(cè)服務(wù),這也意味著對(duì)于注冊(cè)的多個(gè)服務(wù)來(lái)說(shuō),多數(shù)的容器也不必提供一個(gè)本地的排序函數(shù),因?yàn)槿绻樞蚴侵匾?,就可能需要?Service Location 的 API。
3. 創(chuàng)建對(duì)象
MVC 使用服務(wù)定位器最后的策略就是直接創(chuàng)建對(duì)象,這最好通過(guò)依賴注入的服務(wù)來(lái)實(shí)現(xiàn),我們將試圖通過(guò) Service Location 來(lái)創(chuàng)建對(duì)象,一個(gè)典型的例子就是控制器對(duì)象 Controller。
當(dāng) MVC 試圖創(chuàng)建新的對(duì)象的時(shí)候,它將會(huì)請(qǐng)求服務(wù)定位器來(lái)創(chuàng)建這個(gè)對(duì)象,如果服務(wù)定位器不能完成這個(gè)任務(wù),那么,將會(huì)回退到 MVC2 的行為,通常意味著使用 Activator.CreateInstance 來(lái)創(chuàng)建。
IDependencyResolver
為了在 MVC3 中使用服務(wù)定位,在 MVC3 中提供了一個(gè)接口 IDependencyResolver 和一個(gè)新的類 DependencyResolver,
1 public interfac IDependencyResolver2 {
3 object GetService( Type serviceType );
4 IEnumerable<object> GetServices( Type serviceType );
5 }
NET技術(shù):ASP.NET MVC3 Service Location,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。