天天看點

IoC在ASP.NET Web API中的應用一、 基于IoC的HttpControllerActivator二、基于IoC的DependencyResolver

控制反轉(Inversion of

Web API的HttpController激活系統進行內建最為直接的方式莫過于自定義一個HttpControllerActivator。

我們通過一個簡單執行個體來示範如何通過自定義HttpControllerActivator的方式實作與IoC的內建,我們采用的IoC架構是Unity。我們在一個ASP.NET

Web

API應用中定義了這個UnityHttpControllerActivator類型。UnityHttpControllerActivator具有一個表示Unity容器的屬性UnityContainer,該屬性在構造函數中被初始化。在用于建立的HttpController的Create方法中,我們調用此UnityContainer對象的Resolve方法建立目标HttpController對象。

接下來我們定義了如下一個繼承自ApiController的ContactsController來管理聯系人資訊。簡單起見,我們隻定義了唯一的Action方法Get用于擷取聯系人資訊。該方法具有一個可預設的參數id表示希望擷取的聯系人的ID,如果沒有提供此參數則傳回所有聯系人清單。

Action方法利用Repository屬性傳回的對象來實施聯系人的查詢工作,這個IContactRepository接口類型的屬性在構造函數中初始化。我們利用IContactRepository接口來抽象對聯系人資料的存儲,如下面的代碼片斷所示,我們在此接口中僅定義了唯一的GetContacts方法根據指定的添加來篩選對應的聯系人清單。

我們定義了如下一個DefaultContactRepository類型作為IContactRepository接口的預設實作者,簡單起見,我們采用一個靜态字典來儲存聯系人清單。

當此ASP.NET Web

API應用運作之後,我們可以直接在浏覽器中輸入相應的位址擷取所有聯系人清單(“/api/contacts”)和針對某個ID為“001”(“/api/contacts/001”)的聯系人資訊,相應的聯系人資訊會以如下圖所示的形式出現在浏覽器上。

IoC在ASP.NET Web API中的應用一、 基于IoC的HttpControllerActivator二、基于IoC的DependencyResolver

由于預設的DefaultHttpControllerActivator會先利用目前注冊的DependencyResolver對象去激活目标HttpController,是以除了利用自定義的HttpControllerActivator将IoC引入HttpController激活系統之外,另一個有效的方案就是注冊自定義的DependencyResolver。

接下來将要自定義的DependencyResolver基于另一個叫作“Ninject”的IoC架構。較之Unity,Ninject是一個更加輕量級的IoC架構。篇幅所限,我們不便對這個IoC架構作過多的介紹,有興趣的讀者可以通路其官網(“http://www.ninject.org/”)了解Ninject。

我們建立了如上一個類型為NinjectDependencyResolver的自定義DependencyResolver。NinjectDependencyResolver的核心是類型為IKernel的隻讀屬性Kernel,用于擷取服務執行個體的GetService和GetServices方法分别通過調用此Kernel屬性的TryGet和GetAll方法來實作。BeginScope方法傳回一個新的NinjectDependencyResolver對象,它與自身擁有同一個Kernel對象。我們定義了額外的方法Register<TFrom,TTo>來注冊接口與實作類型之間的映射關系。為了確定擷取的服務執行個體能夠被正常地釋放,我們定義了一個元素類型為IDisposable的清單。如果擷取的對象實作了IDisposable接口,它會被放入這個清單中,我們在實作的Dispose方法中釋放該清單中的所有對象。

現在我們将這個自定義的NinjectDependencyResolver應用到上一個示範執行個體中。我們隻需要将Global.asax中針對自定義HttpControllerActivator的注冊替換成針對NinjectDependencyResolver的注冊即可。運作此ASP.NET

Web API應用後通過浏覽器試圖擷取聯系人資訊,我們依然會得到如上圖所示的結果。

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/p/ioc-4-asp-net-web-api.html" target="_blank">原文連結</a>

繼續閱讀