在ASP.NET MVC中使用Unity進行依賴注入的三種方式

來源:互聯網
上載者:User

標籤:

在ASP.NET MVC4中,為了在解開Controller和Model的耦合,我們通常需要在Controller啟用系統中引入IoC,用於處理使用者請求的 Controller,讓Controller依賴於ModelRepository的抽象而不是它的實現。

我們可以在三個階段使用IoC實現上面所說的解耦操作,首先需要簡單介紹一下預設情況下Controller的啟用過程:

1、使用者發送請求黑ASP.NET,路由系統對請求進行解析,根據註冊的路由規則對請求進行匹配,解析出Controller和Action的名稱等資訊。

2、將解析出的資訊交給一個MvcRouteHandler對象進行處理,MvcHttpHandler中存在以個ControllerFactory成員,如果建構函式中沒有提供一個實現IControllerFactory介面的對象,則預設建構函式通過調用ControllerBuilder.Current.GetControllerFactory()擷取一個這樣的對象。

3、系統調用上文對象中德GetHttpHandler獲得了一個實現了IHttpHandler介面的MvcHandler對象最終處理請求。

4、在 MvcHandler中調用BeginProcessRequest方法繼續處理請求,方法中從1中解析的資訊中獲得Controller和Action 的資訊,而後利用2種的IControllerFactory對象啟用Controller對象,並最終執行相應的Action。

第一種方法

由上文2種可知,我們可以建立自己的IControllerFactory對象實現依賴注入,然而我們可以通過直接繼承 DefaultControllerFactory並重寫GetControllerInstance方法來實現,這樣可以免去重新實現其他一些功能的工作。

以下是使用Unity建立的繼承自DefaultControllerFactory的UnityControllerFactory的簡單樣本:

 1 namespace UnitySample 2  3 { 4  5 public class UnityControllerFactory:DefaultControllerFactory 6  7 { 8  9 private IUnityContainer container;10 11 public UnityControllerFactory(IUnityContainer container)12 13 {14 15 this.container = container;16 17 }18 19 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)20 21 {22 23 return null == controllerType ? null : (IController)this.container.Resolve(controllerType);24 25 //return base.GetControllerInstance(requestContext, controllerType);26 27 }28 29 }30 31 }

 

我們可以在App_Start中使用ControllerBuilder設定系統使用這個ControllerFactory

1 IUnityContainer container = new UnityContainer();2 3 container.RegisterType();4 5 UnityControllerFactory factory = new UnityControllerFactory(container);6 7 ControllerBuilder.Current.SetControllerFactory(factory);

 

第二種方法

上文中繼承的DefaultControllerFactory中,使用一個ControllerActivator的成員來實現對 Controller的啟用,如果建立對象中沒有提供一個IControllerActivator對象,則提供一個預設實現了 IControllerActivator的DefaultControllerActivator對象這個類型,這個介面中存在用於建立 Controller對象的Create方法,在DefaultControllerFactory中有存在一個 IControllerActivator類型的構造方法來制定它。所以我們可以使用一個自訂的實現自IControllerActivator借口的對象來進行依賴注入。

 1 namespace UnitySample 2  3 { 4  5 public class UnityControllerActivator:IControllerActivator 6  7 { 8  9 private IUnityContainer container;10 11 public UnityControllerActivator(IUnityContainer container)12 13 {14 15 this.container = container;16 17 }18 19 public IController Create(RequestContext requestContext, Type controllerType)20 21 {22 23 return controllerType == null ? null : (IController)container.RegisterType(controllerType);24 25 }26 27 }28 29 }

 

修改方法1中在App_Start中的代碼,使用這個ControllerActivator:

 1 IUnityContainer container = new UnityContainer(); 2  3 container.RegisterType(); 4  5 //UnityControllerFactory factory = new UnityControllerFactory(container); 6  7 IControllerActivator controllerActivator = new UnityControllerActivator(container); 8  9 DefaultControllerFactory defaultFactory = new DefaultControllerFactory(controllerActivator);10 11 ControllerBuilder.Current.SetControllerFactory(defaultFactory);

 

第三種方法

如同DefaultControllerFactory類中一樣,在DefaultControllerActivator中也存在一個包含一個參數(類型為IDependencyResolver)的構造方法和一個沒有參數的構造方法,預設情況下DefaultControlerFactory使用無參建構函式執行個體化一個DefaultControllerActivator對象,這種情況下提供一個預設的IDependencyResolver 對象。所以我們就同樣可以使用一個自訂的IDependencyResolver類實現依賴注入。在IDependencyResolver介面中存在方法GetService和GetServices來對具體的類型進行解析

 1 namespace UnitySample 2  3 { 4  5 public class UnityDependencyResolver:IDependencyResolver 6  7 { 8  9 private IUnityContainer container;10 11 public UnityDependencyResolver(IUnityContainer container)12 13 {14 15 this.container = container;16 17 }18 19 public object GetService(Type serviceType)20 21 {22 23 return container.Resolve(serviceType);24 25 }26 27 public IEnumerable<object>GetServices(Type serviceType)28 29 {30 31 return container.ResolveAll(serviceType);32 33 }34 35 }36 37 }

 

修改App_Strat中的方法,使用這個自訂的DependencyResolver:

1 IUnityContainer container=new UnityContainer();2 3 container.Register Type<IXXXRepository,XXXRepository>();4 5 UnityDependencyResolver resolver=new UnityDependencyResolver(container);6 7 DependencyResolver.SetResolver(resolver)

 

在ASP.NET MVC中使用Unity進行依賴注入的三種方式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.