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 Unity
Container _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 Mvc
Application : 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-08-26 02:50:14

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

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

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

AngularJS 依赖注入详解和简单实例_AngularJS

AngularJS 依赖注入 什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分. 该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则.与服务定位器模式形成直接对比的是,它允许客户端了解客户端如何使用该系统找到依赖 一句话 --- 没事你不要来找我,有事我会

依赖注入框架Autofac的简单使用

     Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://code.google.com/p/autofac/downloads/list http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html http://www.cnblogs.com/hkncd/archive

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 5 &amp; MVC6系列(7):依赖注入

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

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):依赖注入_自学过程

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