ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)

转载 2013年08月21日 18:49:56

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时,

也是想让大家提提自己的建议, 今天下载了微软发布的最新的 ASP.NET MVC3 Beta 版,同时也仔细阅读了它的 Release Notes,

让我感觉到惊喜的是,MVC3增加了对依赖注入的支持,增加了一个 IDependencyResolver 接口定义,真的是很不错,比起我原来的实现要顺畅很多,

还是老方法,上微软牛人们的博客逛一圈看看有没有已经写好的代码,有就拿来用之,没有就只能自己写了,结果让我很失望,也可能是我太笨,

我没有找到一个完整的示例,只有一些代码片断,于是,我将其整理了一翻,也有一点点个人的心得,拿出来,与大家分享一下,

如遇高人请不吝赐教,下面是代码片断。

1、实现 MVC3 Beta 中提供的依赖注入接口 IDependencyResolverMyDependencyResolver.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)在自己的博客中也多次提到:

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://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html

 

在下 e 文太差,我就不丢人了,e 文好的自己看吧。

 

这里是采用Unity依赖注入框架的完整示例:下载(环境:VS2010 + MVC3 Beta + Unity) 

这里是采用Ninject依赖注入框架的完整示例:下载(环境:VS2010 + MVC3 Beta + Ninject)

ASP.NET MVC 3让依赖注入实现得更简单

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的ASP.NE...

ASP.NET MVC 3让依赖注入实现得更简单

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的ASP.NE...
  • xxglyy
  • xxglyy
  • 2012年09月10日 21:50
  • 424

【ASP.Net MVC3 】使用Unity 实现依赖注入

什么是Unity? Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实...

转载:ASP.NET MVC4 NInject 使用示例教程

Ninject介绍: Ninject是一个轻量级的基于.Net平台的依赖注入框架。 Ninject能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Nin...
  • oppos69
  • oppos69
  • 2015年01月28日 17:07
  • 665

ASP.NET MVC3实战系列(一):简单示例

ASP.NET MVC已经推出时间不短了,已经有很多项目在使用这个优秀的WEB开发框架。因为我们项目每次加人的时候,对MVC都不是特别熟悉,有一些人认为这个非常简单,导致写出来的程序完全不是MVC的,...

ASP.NET MVC 的依赖注入

最近留意了一下ASP.NET MVC 的依赖注入,也看了不少相关的文章,自己也尝试了两种,分别为 NInject 和 Unity ,  在使用的过程中,也渐渐的了解了依赖注入的思想,于是从网上下...

扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1

今天开始天屹将给大家分享一个扩展的ASP.NET MVC三层框架,并使用StructureMap实现依赖注入,充分的使代码之间的耦合度降到最低。由于时间精力有限天屹无法在一篇文章中全部介绍完,将把文章...

理解ASP.NET MVC的DependencyResolver组件 (依赖注入)

转 http://www.cnblogs.com/xiaoxiaojia/p/5362356.html 一、前言    DependencyResolver是MVC中一个重要的组件,从名字可以看...

扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1-Model层的实现

今天开始天屹将给大家分享一个扩展的ASP.NET MVC三层框架,并使用StructureMap实现依赖注入,充分的使代码之间的耦合度降到最低。由于时间精力有限天屹无法在一篇文章中全部介绍完,将把文章...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)
举报原因:
原因补充:

(最多只允许输入30个字)