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 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. MySQL 5.1.63 单机配置多实例(简单配置)

    需求: 在一台服务器上通过源码编译安装一个版本为5.1.63版本MySQL数据库: 方案:将所有配置文件与数据等均存放在/home/zhaoshuangshuang下.在同一个MySQL中运行两个实例 ...

  2. SQLSERVER 更改默认端口号

    最近这几天,服务器的数据库(SQLSERVER)老是遭受到攻击,有人不断地轮训想登陆数据库,从SQL的日志里可以看出来,一开始我是通过本地安全策略禁用了对应的几个攻击ip,同时把数据库的sa账号给禁用 ...

  3. Qt多国语言

    项目中需要多语言的部分以tr宏包含 例:setWindowTitle(tr("编辑")); .pro项目文件加入CODECFORTR = utf-8 #or gbk#DEFAULT ...

  4. WDC2106 iOS10新特性及开发者要注意什么

    昨晚苹果在旧金山召开了WWDC,看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强 ...

  5. SpringMVC注解@RequestParam(转)

    鸣谢:http://shawnccx.iteye.com/blog/730239 -------------------------------------------------- 在SpringM ...

  6. Recommender Systems引言

    我想站在大神肩膀上...貌似是计算所的一个小伙伴... 总结的很好,看得出来有一定的功底.... 不过对于自己看过了的东西,就不愿意再翻看第二遍了.恰好这本书和项亮那本很像,就直接看这本书了.顺便记记 ...

  7. The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemK:K-Nice

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3212 题意:构造出一个n*m的有k个上下左右的和等于中间数的小矩阵的任意矩 ...

  8. Linux---Ls命令 初级实现

    By xxx0624Done:    ls    ls -a    ls -l    ls /tmp    ls -R    ls -t    FileName color    FileName o ...

  9. android 安全需要关注

    1.通过签名校验保护,能有效避免应用被二次打包,杜绝盗版应用的产生2.对内存数据进行变换处理和动态跟踪,有效防止数据被获取和修改3.对代码进行加密压缩,可防止破解者还原真实代码逻辑,避免被复制4.多重 ...

  10. CentOS7.1配置远程桌面

    网上看了很多资料,完全是乱的. 我使用的是CentOS7.1的系统.我的要求是windows的客户机可以远程访问CentOS系统. 1,首先需要检查一下服务器是否已经安装了VNC服务,检查服务器的是否 ...