技术开发 频道

ASP.NET MVC3实践让依赖注入来的更简单

    【IT168 技术文档】我写了一篇文章(参见:深入解读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 ) );
        }
    }
}

 

0
相关文章