一起谈.NET技术,ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)

  昨天,我写了一篇文章(参见: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 { get; set; }
        
        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

时间: 2024-10-28 03:25:44

一起谈.NET技术,ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)的相关文章

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

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时, 也是想让大家提提自己的建议, 今天下载了微软发布的最新的 ASP.NET MVC3 Beta 版,同时也仔细阅读了它的 Release Notes, 让我感觉到惊喜的是,MVC3增加了对依赖注入的支持,增加了一 个 IDependencyResolver 接口定义,真的是很不错,比起我原来的实现要顺畅很多, 还是老方法,上微软牛人们的博客逛一圈看看有没有已经写好的代码

ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内容相对分散和零碎,我们有必要针对这个主题作一个归纳性的介绍.采用依赖注入的服务均由某个ServiceProvider来提供,但是在ASP.NET Core管道涉及到两个不同的ServiceProvider,其中一个是在管道成功构建后创建并绑定到WebHost上的ServiceProvider,对应着

ASP.NET Core中的依赖注入(2):依赖注入(DI)

IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计模式以不同的方式实现IoC,比如我们在上面介绍的模板方法.工厂方法和抽象工厂,接下来我们介绍一种更为有价值的IoC模式,即依赖注入(DI:Dependency Injection,以下简称DI). 目录 一.由外部容器提供服务对象 二.三种依赖注入方式     构造器注入     属性注入     方法注入

ASP.NET Core中的依赖注入(3): 服务的注册与提供

在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core中的DI容器体现为一个实现了IServiceProvider接口的对象. ServiceProvider与ServiceDescriptor 服务的注册与提供     利用ServiceProvider来提供服务     提供一个服务实例的集合     获取ServiceProvider自身对象  

ASP.NET Core 中的依赖注入 [共7篇]

一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化",我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务.要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Contro

解读ASP.NET 5 &amp; MVC6系列(7):依赖注入

原文:解读ASP.NET 5 & MVC6系列(7):依赖注入 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程序,MVC6也利用了依赖注入的功能重新对Controller和View的服务注入功能进行了重新设计:未来的依赖注入功能还可能提供更多的API,所有如果还没有开始接触依赖注入的话,就得好好学一下了. 在之前版本的依赖注入功能里,依赖注入的

解读ASP.NET 5 &amp; MVC6系列教程(7):依赖注入_自学过程

在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程序,MVC6也利用了依赖注入的功能重新对Controller和View的服务注入功能进行了重新设计:未来的依赖注入功能还可能提供更多的API,所有如果还没有开始接触依赖注入的话,就得好好学一下了. 在之前版本的依赖注入功能里,依赖注入的入口有MVC中的IControllerFactory和Web A

一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就是OAuth.新浪微博这个开放系统做的就很好.但OAuth并非本文讨论范畴.这里主要讨论jQuery1.5 jsonp 在Asp.net MVC3 中的应用. 本文应用场景: 假设您的开发团队欲为某集团公司开发一整套信息管理系统,目前首要开发的就是一套订单系统和一套内部OA系统.前提是这两套系统使用

一起谈.NET技术,ASP.NET MVC3 Service Location

介绍 ASP.NET MVC3 的一个重要的新特性就是允许注册一个服务点 Service Location,然后在框架中使用的能力.以前版本的 MVC 已经提供了 Service Location 和依赖注入的机会,在 MVC3 中,我们正式提供了这种能力,并且为开发者开放了多种使用的机会. 总体策略 关于 Service Location 的最重要的部分就是它是可选的,这意味着如果你对 Service Location 不感兴趣,那么,你不需要被强制使用,你总是可以在不使用 Service L