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

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

1.问题场景

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

  1. public interface IMessageProvider
  2. {
  3. string GetMessage();
  4. }
  5.  
  6. public class NinjectMessageProvider : IMessageProvider
  7. {
  8. public string GetMessage()
  9. {
  10. return "This message was provided by Ninject";
  11. }
  12. }

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

  1. public class HomeController : Controller
  2. {
  3. private IMessageProvider MessageProvider { set; get; }
  4.  
  5. public HomeController()
  6. {
  7. this.MessageProvider = new NinjectMessageProvider();
  8. }
  9.  
  10. public ActionResult Index()
  11. {
  12. string message = this.MessageProvider.GetMessage();
  13. return View( (object) message);
  14. }
  15.  
  16. ......
  17. }

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

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

2. 获取 NInject

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

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

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

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

3. 简单使用

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

  1. using Ninject;

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

  1. public HomeController()
  2. {
  3. Ninject.IKernel ninjectKernel = new Ninject.StandardKernel();
  4. ninjectKernel.Bind<IMessageProvider>()
  5. .To<NinjectMessageProvider>();
  6. this.MessageProvider = ninjectKernel.Get<IMessageProvider>();
  7. }
  1. 这里的 Ninject.IKernel Ninject 的核心。

4. 使用依赖注入

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

  1. public HomeController(IMessageProvider provider)
  2. {
  3. this.MessageProvider = provider;
  4. }

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using Ninject;
  7. using MvcApplication1.Controllers;
  8.  
  9. namespace MvcApplication1
  10. {
  11. public class NinjectDependencyResolver
  12. :System.Web.Mvc.IDependencyResolver
  13. {
  14. private Ninject.IKernel kernel;
  15. public NinjectDependencyResolver()
  16. {
  17. this.kernel = new Ninject.StandardKernel();
  18. this.AddBindings();
  19. }
  20.  
  21. private void AddBindings()
  22. {
  23. this.kernel.Bind<IMessageProvider>()
  24. .To<NinjectMessageProvider>();
  25. }
  26.  
  27. public object GetService(Type serviceType)
  28. {
  29. return this.kernel.TryGet(serviceType);
  30. }
  31.  
  32. public IEnumerable<object> GetServices(Type serviceType)
  33. {
  34. return this.kernel.GetAll(serviceType);
  35. }
  36. }
  37. }

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

  1. System.Web.Mvc.DependencyResolver.SetResolver(
  2. new MvcApplication1.NinjectDependencyResolver()
  3. );
  4.  
  5. AreaRegistration.RegisterAllAreas();
  6.  
  7. WebApiConfig.Register(GlobalConfiguration.Configuration);
  8. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  9. RouteConfig.RegisterRoutes(RouteTable.Routes);

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

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

5. 使用属性注入

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

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

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

  1. public NinjectDependencyResolver()
  2. {
  3. this.kernel = new Ninject.StandardKernel();
  4. this.kernel.Settings.InjectNonPublic = true;
  5. this.AddBindings();
  6. }

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

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

在 ASP.NET MVC4 中使用 NInject的更多相关文章

  1. ASP.NET MVC4中使用Ninject

    1.NuGet获取Ninject.dll 选中项目右键: .NET技术交流群 199281001 .欢迎加入. 2.全局注册  Global.asax.cs //注册Ninject依赖注入全局解析器 ...

  2. MVC4中使用Ninject

    MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册  Global.asax.cs  RegisterNinje ...

  3. ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)

    在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...

  4. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  5. ASP.NET MVC4中使用NHibernate

    ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...

  6. ASP.NET MVC中使用Ninject

    ASP.NET MVC中使用Ninject 在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事 ...

  7. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  8. 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计

    在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...

  9. ASP.NET MVC4中的App_start中BundleConfig的介绍使用

    在BundleConfig.cs中,指定CSS和JS,主要用来压缩JS和CSS   在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压 ...

随机推荐

  1. Mac环境下装node.js,npm,express;(包括express command not found)

    1. 下载node.js for Mac 地址: http://nodejs.org/download/ 直接下载 pkg的,双击安装,一路点next,很容易就搞定了. 安装完会提醒注意 node和n ...

  2. Runtime 实现 动态添加属性

    利用动态加载为对象添加一个 block 点击属性; .h 文件 #import <UIKit/UIKit.h> @interface UIView (Tap) /** * 动态添加手势 * ...

  3. JQuery 知识点

    1:animate 动画效果 $(function () { $(".sidebar-nav a").mouseover(function () { $(this).animate ...

  4. 在Oracle SQL Developer中创建新连接

    步骤: 1.如下图 2.点击“测试”,如果左下角的状态出现“成功”,说明OK

  5. js按钮点击展开收起

    $('.tab').click(function(){ var index = $('.tab').index(this), //缓存第一次点击的li的索引值 ele = $(this).find(' ...

  6. 如何编写敏捷开发中的user story

    http://blog.csdn.net/chengyb74/article/details/4762247 对于敏捷开发来说,User Story是开发的基础,它不同于传统的瀑布式开发方式,而是把原 ...

  7. 对JAVA动态代理的理解

    叫动态代理就代表着有“静态代理”这回事. 而且,通常“动态”至少听着更NB一点. 关键就在于不明白啥叫“动”,这个得跟“静”比较下. 在我的理解,静态代理得自己声明一个类,实现跟被代理对象同样的接口. ...

  8. Spring MVC Checkbox And Checkboxes Example

    In Spring MVC, <form:checkbox /> is used to render a HTML checkbox field, the checkbox values ...

  9. poj 2454 Jersey Politics 随机化

    随机化算法+贪心! 将3*k排序后分成3分,将第二第三份的和分别加起来,让和与500*k比较,都大于则输出,否则,随机生成2个数,在第二第三份中交换! 代码如下: #include<iostre ...

  10. linux ubuntu关于U盘的安装 开机启动u盘的时候出现/casper/vmlinuz.efi: file not found

    将u盘下的/casper/vmlinuz文件添加一个后缀.efi即可. 重启再装.