浅谈.NET MVC 3的依赖注入

    文章来源:万象互联 更新时间:2012-11-1 17:38:38
分享:

1、实现 MVC3 Beta 中提供的依赖注入接口 IDependencyResolver ,MyDependencyResolver.cs 的代码: 

	
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using Microsoft.Practices.Unity;  
  7.  
  8. namespace Demo  
  9. {  
  10.     public class MyDependencyResolver : IDependencyResolver  
  11.     {  
  12.         #region IDependencyResolver 成员  
  13.  
  14.         /// <summary>  
  15.         /// 依赖注入容器  
  16.         /// </summary>  
  17.         private UnityContainer _unityContainer;  
  18.  
  19.         /// <summary>  
  20.         /// 构造  
  21.         /// </summary>  
  22.         /// <param name="aUnityContainer">依赖注入容器</param>  
  23.         public MyDependencyResolver( UnityContainer aUnityContainer )  
  24.         {  
  25.             _unityContainer = aUnityContainer;  
  26.         }  
  27.  
  28.         public object GetService( Type aServiceType )  
  29.         {  
  30.             try 
  31.             {  
  32.                 return _unityContainer.Resolve( aServiceType );  
  33.             }  
  34.             catch 
  35.             {  
  36.  /// 按微软的要求,此方法,在没有解析到任何对象的情况下,必须返回 null,必须这么做!!!!  
  37.                 return null;  
  38.             }  
  39.         }  
  40.  
  41.         public IEnumerable<object> GetServices( Type aServiceType )  
  42.         {  
  43.             try 
  44.             {  
  45.                 return _unityContainer.ResolveAll( aServiceType );  
  46.             }  
  47.             catch 
  48.             {  
  49.   /// 按微软的要求,此方法,在没有解析到任何对象的情况下,必须返回空集合,必须这么做!!!!  
  50.                 return new List<object>( );  
  51.             }  
  52.         }  
  53.  
  54.         #endregion  
  55.     }  
  56.  


2、在 Global.asax.cs 中设置依赖注入解析器  DependencyResolver (这是一个全局静态类,也是 MVC3 Beta 新增的):         

																																																											
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using System.Web.Routing;  
  7. using Microsoft.Practices.Unity;  
  8.  
  9. namespace Demo  
  10. {  
  11.     // Note: For instructions on enabling IIS6 or IIS7 classic mode,   
  12.     // visit http://go.microsoft.com/?LinkId=9394801  
  13.  
  14.     public class MvcApplication : System.Web.HttpApplication  
  15.     {  
  16.  public static void RegisterGlobalFilters( GlobalFilterCollection filters )  
  17.         {  
  18.             filters.Add( new HandleErrorAttribute( ) );  
  19.         }  
  20.  
  21.         public static void RegisterRoutes( RouteCollection routes )  
  22.         {  
  23.             routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );  
  24.  
  25.             routes.MapRoute(  
  26.                 "Default", // Route name  
  27.                 "{controller}/{action}/{id}", // URL with parameters  
  28. new { controller = "Home", action = "Index", id = UrlParameter.Optional }  
  29.             );  
  30.  
  31.         }  
  32.  
  33.         protected void Application_Start( )  
  34.         {  
  35.             AreaRegistration.RegisterAllAreas( );  
  36.  
  37.             RegisterGlobalFilters( GlobalFilters.Filters );  
  38.             RegisterRoutes( RouteTable.Routes );  
  39.             //设置依赖注入  
  40.             RegisterDependency( );  
  41.         }  
  42.  
  43.         private static UnityContainer _Container;  
  44.         public static UnityContainer Container  
  45.         {  
  46.             get 
  47.             {  
  48.                 if ( _Container == null )  
  49.                 {  
  50.                     _Container = new UnityContainer( );  
  51.                 }  
  52.                 return _Container;  
  53.             }  
  54.         }  
  55.  
  56.         protected void RegisterDependency( )  
  57.         {  
  58.             Container.RegisterType<ITest, Test>( );  
  59.  DependencyResolver.SetResolver( new MyDependencyResolver( Container ) );  
  60.         }  
  61.     }  


3、Controller的代码,HomeController.cs:   

																																																																																																																										
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using Microsoft.Practices.Unity;  
  7.  
  8. namespace Demo.Controllers  
  9. {  
  10.  public class HomeController : Controller  
  11.     {  
  12.         [Dependency]  
  13.         public ITest Test { get; set; }  
  14.           
  15.         public ActionResult Index( )  
  16.         {  
  17.    ViewModel.Message = Test.GetString( );  
  18.  
  19.             return View( );  
  20.         }  
  21.  
  22.         public ActionResult About( )  
  23.         {  
  24.             return View( );  
  25.         }  
  26.     }  


4、ITest.cs代码:            

																																																																																																																																																						
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.  
  6. namespace Demo  
  7. {  
  8.     public interface ITest  
  9.     {  
  10.         string GetString( );  
  11.     }  


5、Test.cs代码:      

																																																																																																																																																																			
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.  
  6. namespace Demo  
  7. {  
  8.     public class Test:ITest  
  9.     {  
  10.         #region ITest 成员  
  11.  
  12.         public string GetString( )  
  13.         {  
  14.             return "Run demo!";  
  15.         }  
  16.  
  17.         #endregion  
  18.     }  


 注:这篇文章只适用于 ASP.NET MVC3 Beta 版。

从 MVC1 -> MVC3 Preview1 -> MVC3 Beta 一直都在变化,微软Brad Wilson在自己的博客中也多次提到:

Disclaimer
This blog post talks about ASP.NET MVC 3 Beta, which is a pre-release version. Specific technical details may change before the final release of MVC 3. 

This release is designed to elicit feedback on features with enough time to make meaningful changes before MVC 3 ships,

so please comment on this blog post or contact me if you have comments.

文章来源:http://www.hulian.top,转载请注明!

版权说明:本站原创文章,由万象互联SEO优化发表.
本文地址:https://www.hulian.top/zixun/post/5351.html
在线咨询
  • 在线时间
  • 8:00-21:00