好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

在 ASP.NET MVC4 中使用 NInject

在 ASP.NET MVC4 中使用 NInject

在 ASP.NET MVC4 中使用 NInject

Ninject是一个快如闪电、超轻量级的基于.Net平台的依赖注入框架。它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject配套你的软件架构,那么代码将会变得更加容易编写、重用性强、易于测试和修改。

MVC4 配合 Ninject 3 更是如虎添翼。

1.问题场景

在 MVC 的开发中,我们通常会使用到后台的数据,比如说需要获取一个后台的信息。通常会定义一个访问信息的接口,然后,有一个类实现了这个接口。

 public   interface   IMessageProvider
{
      string   GetMessage();
}

  public   class   NinjectMessageProvider : IMessageProvider
{
      public   string   GetMessage()
    {
          return   "  This message was provided by Ninject  "  ;
    }
} 

在控制器中,经常会出现这样的代码。

 public   class   HomeController : Controller
{        
      private  IMessageProvider MessageProvider {  set ;  get  ; }

      public   HomeController()
    {
          this .MessageProvider =  new   NinjectMessageProvider();
    }
        
      public   ActionResult Index()
    {
          string  message =  this  .MessageProvider.GetMessage();
          return  View( ( object  ) message);
    }

    ......
} 

这里使用了构造函数来创建提供器对象实例。问题是,在网站中,我们会出现大量的 Controller,那么,在每个 Controller 中我们都需要写这样的代码,进一步讲,如果我们以后需要创建的提供器对象类型不再是 NinjectMessageProvider 类型了,就会导致大量的修改。

使用 NInject 可以让这些问题迎刃而解。

2. 获取 NInject

下载地址: http://www.ninject.org/

第一种方式是常用的引用程序集方式,首先到官方网站下载,注意有多种版本。

 解压之后,你会得到一个名为 Ninject.dll 的程序集,将它引用到你的项目中。

还有一种方式,是使用 Visual Studio 支持的 NuGet,使用这个工具可以直接帮你从网上下载相应的程序集并引用到项目中。

3. 简单使用

首先,打开控制器的代码文件,在前面使用 using 引用 Ninject 命名空间,这里使用了扩展方法。

 using  Ninject;

然后,将构造函数修改为如下所示:

 public   HomeController()
{
    Ninject.IKernel ninjectKernel  =  new   Ninject.StandardKernel();
    ninjectKernel.Bind <IMessageProvider> ()
        .To <NinjectMessageProvider> ();
      this .MessageProvider = ninjectKernel.Get<IMessageProvider> ();
} 

这里的 Ninject.IKernel 是 Ninject 的核心。

4. 使用依赖注入

在每个控制器中,都这样创建对象,还不如原来方便,好在 MVC 提供了依赖注入的入口,我们将现在的构造函数修改一下,支持构造函数注入。

 public   HomeController(IMessageProvider provider)
{
      this .MessageProvider =  provider;
} 

然后,创建一个 NinjectDependencyResolver,实现 MVC 中提供的注入接口 IDependencyResolver,如下所示。

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

  using   Ninject;
  using   MvcApplication1.Controllers;

  namespace   MvcApplication1
{
      public   class   NinjectDependencyResolver
        :System.Web.Mvc.IDependencyResolver
    {
          private   Ninject.IKernel kernel;
          public   NinjectDependencyResolver()
        {
              this .kernel =  new   Ninject.StandardKernel();
              this  .AddBindings();
        }

          private   void   AddBindings()
        {
              this .kernel.Bind<IMessageProvider> ()
                .To <NinjectMessageProvider> ();
        }

          public   object   GetService(Type serviceType)
        {
              return   this  .kernel.TryGet(serviceType);
        }

          public  IEnumerable< object >  GetServices(Type serviceType)
        {
              return   this  .kernel.GetAll(serviceType);
        }
    }
} 

不要忘记第三步,注册这个容器。在 Global.asax 中,添加如下代码。

 System.Web.Mvc.DependencyResolver.SetResolver(
      new   MvcApplication1.NinjectDependencyResolver()
);

AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); 

重新运行程序,你会发现控制器已经能够直接获取消息提供器对象了。

在 MVC 获取控制器对象的时候,会发现需要为构造函数传递一个实现接口 IMessageProvider 的对象实例,Ninject 发现已经注册的类型为 NinjectMessageProvider,那么,Ninject 就会自动帮助我们创建一个对象实例,再将这个对象实例传递到控制器中。

5. 使用属性注入

如果控制器中没有使用构造函数注入,而是使用了属性注入呢?完全没有问题,你只需要标注一个特性。注意:这个属性的作用域必须是 public 的。

 [Ninject.Inject]
  public  IMessageProvider MessageProvider {  set ;  get ; }

什么?你的这个成员是 private 的?没有问题,设置一下,让 Ninject 也可以注入非公共的成员就可以了。

 public   NinjectDependencyResolver()
{
      this .kernel =  new   Ninject.StandardKernel();
      this .kernel.Settings.  InjectNonPublic   =  true  ;
      this  .AddBindings();
} 

这样,下面的成员也可以注入。

 [Ninject.Inject]
  private  IMessageProvider MessageProvider {  set ;  get ; }

 

分类:  ASP.NET ,  ASP.NET MVC

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于在 ASP.NET MVC4 中使用 NInject的详细内容...

  阅读:54次

上一篇: memcache 和appfabric

下一篇:Block编程