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 ...
随机推荐
- 多物体运动框架案例一:多个Div的宽度运动变化
多物体运动框架,鼠标移入Div,此Div逐渐变宽,鼠标移出后,此Div逐渐缩短恢复原长度. <!doctype html> <html> <head> <ti ...
- 微信小程序调用微信支付
1,首先我们先缕清支付的整个流程,详见https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3,第一 ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
- Python初学1
windows版python下载: https://pan.baidu.com/s/1dsAPp0C9PJUF73kFDdAzXQ 安装时勾选pip和Add python.exe to Path. w ...
- SQL基本操作——事务
事务是并发和恢复控制的基本单元. 事务四个属性:原子性.一致性.隔离性.持久性. 原子性:一个事务是一个不可分割的单位,事务中包括的诸多操作要么成功要么都失败. 一致性:事务必须使数据库从一个一致性状 ...
- 网站Gzip压缩
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:启用网站GZI ...
- [Windows Server 2003] 安装IIS6.0及FTP
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS6. ...
- C# 设定时间内自动关闭提示框
通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭.然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API ...
- shell脚本网络流量实时查看
Linux网络流量实时查看脚本,Centos默认没有自带流量查看工具,通过网上的资料做了一些修改 #!/bin/bash # Author: Ca0gu0 # Script Name: idev.sh ...
- C# 获得Properties下的定义的资源
var str1 = Properties.Resources.ResourceManager.GetObject("String1", null); string url = S ...