在 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
第一种方式是常用的引用程序集方式,首先到官方网站下载,注意有多种版本。
解压之后,你会得到一个名为 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的更多相关文章
- ASP.NET MVC4中使用Ninject
1.NuGet获取Ninject.dll 选中项目右键: .NET技术交流群 199281001 .欢迎加入. 2.全局注册 Global.asax.cs //注册Ninject依赖注入全局解析器 ...
- MVC4中使用Ninject
MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册 Global.asax.cs RegisterNinje ...
- ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...
- WebSocket在ASP.NET MVC4中的简单实现
WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...
- ASP.NET MVC4中使用NHibernate
ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...
- ASP.NET MVC中使用Ninject
ASP.NET MVC中使用Ninject 在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事 ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计
在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...
- ASP.NET MVC4中的App_start中BundleConfig的介绍使用
在BundleConfig.cs中,指定CSS和JS,主要用来压缩JS和CSS 在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压 ...
随机推荐
- 干货CentOS6.5_Nginx1.40_Php5.57_MySQL5.5.35编译安装全记录
http://www.unixdo.com/Unix_Linux/CentOS65_Nginx140_Php557_MySQL5535.html 如果是编译升级php,之前做过nginx的虚拟主机配置 ...
- 传统ASP.NET开发和MVC的设计思想
传统ASP.NET开发 第一步:客户端请求服务器: 第二步:服务器从数据库取得数据处理后响应给客户端页面. MVC的设计思想 第一步:客户端请求控制器(里面的一个方法): 第二步:控制器从数据库里取得 ...
- js高级技巧笔记(一)
安全的类型检测 Js的类型检测机制并非完全可靠,发生错误否定及错误肯定的情况也不少: 在safari 在对正则表达式应用typeof操作符时返回"function",因此很难确定某 ...
- js 获取 input file 文件 附给 image src
var a=document.querySelector('input[type=file]'); a.onchange = function (e) { //var reader = new Fil ...
- 深层解析:构建facebook应用商店推荐引擎
Under the Hood: Building the App Center recommendation engine As more apps on Facebook Platform ha ...
- c++ 容器类
#include <iostream> #include <vector> #include <list> #include <map> using n ...
- 数据生成器Bogus的使用以及基于声明的扩展
引言 最近在整理代码,发现以前写的一个数据填充器写了一半没实现,而偏偏这段时间就要用到类似的功能,所以正好实现下. 目标 这个工具的目标是能够在项目初期快速搭建一个"数据提供器", ...
- 30分钟让你了解MongoDB基本操作
今天记录下MongoDB的基本操作,这只是最基本的,所以是应该掌握的. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文件.一个单一的MongoDB服务器通常有多个数据库. 集 ...
- 基于局部敏感哈希的协同过滤算法之simHash算法
搜集了快一个月的资料,虽然不完全懂,但还是先慢慢写着吧,说不定就有思路了呢. 开源的最大好处是会让作者对脏乱臭的代码有羞耻感. 当一个做推荐系统的部门开始重视[数据清理,数据标柱,效果评测,数据统计, ...
- TaskTracker执行map或reduce任务的过程(二)
上次说到,当MapLauncher或ReduceLancher(用于执行任务的线程,它们扩展自TaskLauncher),从它们所维护的LinkedList也即队列中获取到TaskInProgress ...