|
介紹
ASP.NET MVC3 的一個(gè)重要的新特性就是允許注冊(cè)一個(gè)服務(wù)點(diǎn) Service Location,然后在框架中使用的能力。以前版本的 MVC 已經(jīng)提供了 Service Location 和依賴注入的機(jī)會(huì),在 MVC3 中,我們正式提供了這種能力,并且為開(kāi)發(fā)者開(kāi)放了多種使用的機(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ù)。還有其他的類(lèi)似的場(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í)例。
類(lèi)似于單實(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è)新的類(lèi) 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)系我們修改或刪除,多謝。