ASP.NET MVC3 讓依賴注入來的更簡單(新補充了Ninject示例)

作者: 老馬快跑  來源: 博客園  發布時間: 2010-10-17 22:37  閱讀: 6087 次  推薦: 0   原文鏈接   [收藏]  
摘要:很多.NET程序員對ASP.NET MVC3 Beta還是挺感興趣的,本文介紹的是通過MVC 3更簡單的實現依賴注入。

  昨天,我寫了一篇文章(參見:ASP.NET MVC 依賴注入),這種實現方式我個人一直感覺不太順,在寫出來與大家一起分享的同時,

  也是想讓大家提提自己的建議, 今天下載了微軟發布的最新的 ASP.NET MVC3 Beta 版,同時也仔細閱讀了它的 Release Notes,

  讓我感覺到驚喜的是,MVC3增加了對依賴注入的支持,增加了一  個 IDependencyResolver 接口定義,真的是很不錯,比起我原來的實現要順暢很多,

  還是老方法,上微軟牛人們的博客逛一圈看看有沒有已經寫好的代碼,有就拿來用之,沒有就只能自己寫了,結果讓我很失望,也可能是我太笨,

  我沒有找到一個完整的示例,只有一些代碼片斷,于是,我將其整理了一翻,也有一點點個人的心得,拿出來,與大家分享一下,

  如遇高人請不吝賜教,下面是代碼片斷。

  1、實現 MVC3 Beta 中提供的依賴注入接口 IDependencyResolver ,MyDependencyResolver.cs 的代碼:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.Practices.Unity;

namespace Demo
{
    
public class MyDependencyResolver : IDependencyResolver
    {
        
#region IDependencyResolver 成員

        /// <summary>
        /// 依賴注入容器
        
/// </summary>
        private UnityContainer _unityContainer;

        
/// <summary>
        /// 構造
        
/// </summary>
        /// <param name="aUnityContainer">依賴注入容器</param>
        public MyDependencyResolver( UnityContainer aUnityContainer )
        {
            _unityContainer 
= aUnityContainer;
        }

        
public object GetService( Type aServiceType )
        {
            
try
            {
                
return _unityContainer.Resolve( aServiceType );
            }
            
catch
            {
                
/// 按微軟的要求,此方法,在沒有解析到任何對象的情況下,必須返回 null,必須這么做!!!!
                return null;
            }
        }

        
public IEnumerable<object> GetServices( Type aServiceType )
        {
            
try
            {
                
return _unityContainer.ResolveAll( aServiceType );
            }
            
catch
            {
                
/// 按微軟的要求,此方法,在沒有解析到任何對象的情況下,必須返回空集合,必須這么做!!!!
                return new List<object>( );
            }
        }

        
#endregion
    }

}

   2、在 Global.asax.cs 中設置依賴注入解析器  DependencyResolver (這是一個全局靜態類,也是 MVC3 Beta 新增的):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Practices.Unity;

namespace Demo
{
    
// Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    
// visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        
public static void RegisterGlobalFilters( GlobalFilterCollection filters )
        {
            filters.Add( new HandleErrorAttribute( ) );
        }

        
public static void RegisterRoutes( RouteCollection routes )
        {
            routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );

            routes.MapRoute(
                
"Default"// Route name
                "{controller}/{action}/{id}"// URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

        }

        
protected void Application_Start( )
        {
            AreaRegistration.RegisterAllAreas( );

            RegisterGlobalFilters( GlobalFilters.Filters );
            RegisterRoutes( RouteTable.Routes );
            
//設置依賴注入
            RegisterDependency( );
        }

        
private static UnityContainer _Container;
        
public static UnityContainer Container
        {
            
get
            {
                
if ( _Container == null )
                {
                    _Container = new UnityContainer( );
                }
                
return _Container;
            }
        }

        
protected void RegisterDependency( )
        {
            Container.RegisterType<ITest, Test>( );
            DependencyResolver.SetResolver( new MyDependencyResolver( Container ) );
        }
    }
}

  3、Controller的代碼,HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.Practices.Unity;

namespace Demo.Controllers
{
    
public class HomeController : Controller
    {
        [Dependency]
        
public ITest Test { getset; }
        
        
public ActionResult Index( )
        {
            ViewModel.Message = Test.GetString( );

            
return View( );
        }

        
public ActionResult About( )
        {
            
return View( );
        }
    }
}

  4、ITest.cs代碼: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Demo
{
    
public interface ITest
    {
        
string GetString( );
    }
}

  5、Test.cs代碼:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Demo
{
    
public class Test:ITest
    {
        
#region ITest 成員

        public string GetString( )
        {
            
return "Run demo!";
        }

        
#endregion
    }
}

    注意,這篇文章只適用于 ASP.NET MVC3 Beta 版,將來正式版出來了,未必采用這種方式來實現,畢竟對于依賴注入這塊,

  從 MVC1 -> MVC3 Preview1 -> MVC3 Beta 一直都在變化,微軟牛人(Brad Wilson)在自己的博客中也多次提到:

 【原文鏈接】:http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html

0
0
 
標簽:ASP.NET MVC
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()