MVC.Net:MVC.Net与WebAPI的IOC实现
我们通过Ninject(http://www.ninject.org/)项目来帮助我们实现MVC.Net与WebAPI项目的IOC实现。
首先我们来看MVC.Net的IOC实现。
1. 通过NuGet我们安装Ninject.MVC3,它会同时安装Ninject、Ninject.Web.Common和Ninject.Web.Common.WebHost。不用被它的名字干扰,它对MVC.Net 5也是适用的。
2. 安装成功后,在MVC.Net的App_Start目录中会多出一个NinjectWebCommon.cs文件。

3. 打开此文件,然后在RegisterServices方法中添加类的绑定,例如:
private static void RegisterServices(IKernel kernel)
{
// DBContext必须要per Http Request per Instance。
kernel.Bind<DemoModelContainer>().ToSelf().InRequestScope(); kernel.Bind<IPostService>().To<PostService>(); kernel.Bind<IPostRepository>().To<PostRepository>();
}
4. 这时我们就可以在直接在类中引用接口,而不用是指定该接口是由哪个具体类实现的。例如:
private DemoModelContainer _dbContext; private IPostService _postService; public PostController(DemoModelContainer dbContext, IPostService postService)
{
_dbContext = dbContext; _postService = postService;
}
5. 在系统运行后,Ninject会自动将接口对应的类给传入构造函数中。另外还有个有趣的代码就是DemoModelContainer。这个类不是一个接口,是一个EntityFramework的DBContext。在这里我们之所以使用Ninject来管理,是为了实现自动针对每个Request来实例化DBContext,同时又能保证在Request销毁后,对应的DBContext实例也同时销毁。如果不通过Ninject,那么我们就需要给每个Controller实现Dispose方法,然后显式销毁。
========================================
对于WebAPI来说,除了以上步骤,还需要多操作几步:
1. 创建NinjectResolver.cs和NinjectScope.cs两个类文件,代码如下:
NinjectResolver.cs
using Ninject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Dependencies; namespace NinjectWebApi.Models
{
public class NinjectResolver : NinjectScope, IDependencyResolver
{
private IKernel _kernel;
public NinjectResolver(IKernel kernel)
: base(kernel)
{
_kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectScope(_kernel.BeginBlock());
}
}
}
NinjectScope.cs
using Ninject.Activation;
using Ninject.Parameters;
using Ninject.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies; namespace NinjectWebApi.Models
{
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot; public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
} public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
} public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[], true, true);
return resolutionRoot.Resolve(request).ToList();
} public void Dispose()
{
IDisposable disposable = (IDisposable)resolutionRoot;
if (disposable != null) disposable.Dispose();
resolutionRoot = null;
}
}
}
2. 修改NinjectWebCommon.cs的CreateKernel方法:
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel); // WebApi项目必须添加此行
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =
new NinjectWebApi.Models.NinjectResolver(kernel); return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
其它的操作都和MVC.Net一样,这样WebAPI的IOC也实现了。
MVC.Net:MVC.Net与WebAPI的IOC实现的更多相关文章
- Taurus.MVC 2.3.4 :WebAPI 文档集成测试功能升级:WebAPI批量自动化测试功能。
前言: 最近升级了一下Taurus.MVC,现在最新版本是:Taurus.MVC 2.3.4,源码版本和nuget同步. 下面分三个步骤介绍下新版本的WebAPI批量自动化测试功能. 1.启用WebA ...
- ASP.NET MVC 理解MVC模式
ASP.NET MVC 理解MVC模式 PS:MVC出来很久了,工作上一直没机会用,所以我也没去学.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各位园友的斧正. ...
- 【ASP.NET MVC】MVC概述
描述 本篇文章主要概述ASP.NET MVC,具体包括如下内容: 1.MVC模式概述 2.WebForm概述 3.WebForm与MVC区别 4.ASP.NET MVC发展历程 5.运用程序结构 6. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- ASP.NET MVC 教程-MVC简介
ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种不同的开发模式:Web Pages(Web 页面).MVC(Mode ...
- Spring MVC静态资源处理——<mvc:resources /> ||<mvc:default-servlet-handler /> 转载
Spring MVC静态资源处理——<mvc:resources /> ||<mvc:default-servlet-handler /> mvcmvc:resources ...
随机推荐
- [Swift通天遁地]二、表格表单-(17)制作在表单左侧添加单选和复选组件的表单行
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 你真的知道GET和POST两种基本请求方法的区别吗?
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- $tsinsenA1067$
\(problem\) 这种题目需要一个定理 \(a[1]+a[2]+a[3]+a[4]...=(a[1]%mod)+...\) 本人出奇的懒 然后 动态规划?(恰似枚举) #include < ...
- 解决Oracle 本地可以连接,远程不能连接问题
一.问题描述: 1.telnet 2.输入命令 lsnrctl status 远程访问不到的原因为:监听指向的是localhost,而不是你本机的远程访问ip地址,因此需要将监听的指向修改为你本机的远 ...
- MySQL的安装和启动
一.MySQL各类安装方法的比较 在Linux系统下,MySQL有3种主要的安装方式,分别是:RPM安装.二进制安装.源码安装.三种安装方式的优缺点如下表所示: RPM安装 二进制安装 源码安装 ...
- 实现div毛玻璃背景
毛玻璃效果 ios里毛玻璃效果的使用非常多,本文介绍一个实现div毛玻璃背景的方法 CSS3 Filter CSS3的Filter主要用在图像的特效处理上,默认值为none,还有以下备选项: 1. ...
- Android传递中文参数方法(之一)
最近在做app,用的volley传参,有一个地方传中文参数不行(貌似是get方式),我又试了下post方式,成功了,记录下,以后有用! RequestQueue requestQueue = Voll ...
- [Android]有关外部链接唤醒App需要注意的坑
移动互联网发展到今天,一个移动app需要和各种各样的外部链接关联,它不再仅仅从手机的桌面启动,更多的将会从其他的应用.浏览器链接.短信.二维码或者微信分享等渠道启动,这里涉及到的是各种各样的营销渠道和 ...
- 如何用java生成随机验证码
1.VerifyCode 类: 1 package com.HRuinger.enity; ImageIO.write(image, " ...
- RPU4+1视图(转)
4+1视图模型概况 Kruchten 提出了一个"4+1"视图模型,从5个不同的视角包括包括逻辑试图.进程视图.物理视图.开发视图.场景视图来描述软件体系结构.每一个视图只关心系统 ...