IOC应用之 Ninject
什么是Ninject
Ninject是一套.Net平台下的高效,超轻量级的依赖注入库。它可以帮助你实现应用程序的松耦合,高内聚,同时也能很灵活的把它们进行组合在一起。借助与Ninject的帮助,代码的使用,复用,测试和修改变得异常的简单。
为什么使用Ninject
既然在.Net平台下依赖注入已经很普遍,同时也已经有了好几个依赖注入库。为什么我们还要另外编写一套呢?
首先,目前其他框架依赖于XML配置文件,通过配置文件去引导框架的组件的工作,这将带来以下不足:
1. 配置文件会很长,并且很冗余,因为你必须为每一个类型重复性的去写他得描述信息;
2. 一个简单的配置错误就会导致整个工程的瘫痪;
第二点,其他框架是很庞大的类库,那么意味着库还依赖于其他库,这对于小型的系统而言就会产生“框架膨胀”的问题。
第三点,Ninject提出了一种异常强大并且灵活的“上下文绑定”技术。类比简单的字符串绑定,Ninject能感知环境,并且能根据不同的运行环境实现不同的接口。
事例
public interface IWeapon
{
void Attack(string target);
}
public class Sword : IWeapon
{
public void Attack(string target)
{
Console.WriteLine("Attack " + target + " by sword");
}
}
public class Knife : IWeapon
{
public void Attack(string target)
{
Console.WriteLine("Attack " + target + " by knife");
}
}
类型绑定
public class WeaponModule : NinjectModule
{
public override void Load()
{
this.Bind().To();
}
}
使用
static void Main(string[] args)
{
IKernel kernel = new StandardKernel(new WeaponModule());
IWeapon weapon = kernel.Get();
weapon.Attack("小明");
Console.ReadKey();
}
对象作用域
|
作用域 |
绑定方法 |
说明 |
|
Transient |
.InTransientScope() |
每次调用创建新实例。 |
|
Singleton |
.InSingletonScope() |
单例,仅创建一个实例。 |
|
Thread |
.InThreadScope() |
每一个线程创建一个实例。 |
|
Request |
.InRequestScope() |
每当Web请求发起时创建一个实例,结束请求时释放实例 |
复杂绑定处理
this.Bind().To().Named("Sword");
this.Bind().To().Named("Knife");
IWeapon weapon1 = kernel.Get("Sword");
IWeapon weapon2 = kernel.Get("Knife");
动态载入模块
IKernel kernel = new StandardKernel();
kernel.Load(AppDomain.CurrentDomain.GetAssemblies());
扩展Asp.Net MVC
// 重写ControllerFactory
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel _kernel = new StandardKernel(new PersonModule());
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType == null) return null;
return (IController)_kernel.Get(controllerType);
}
} // 重新设置ControllerFactory
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// 设置ControllerFactory为NinjectControllerFactory
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
IOC应用之 Ninject的更多相关文章
- 轻量级IOC框架:Ninject
Ninject 学习杂记 - liucy 时间2014-03-08 00:26:00 博客园-所有随笔区原文 http://www.cnblogs.com/liucy1898/p/3587455.h ...
- 轻量级IOC框架:Ninject (上)
前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...
- 轻量级IOC框架:Ninject (下)
一,创建依赖链(Chains of Dependency) 当我们向Ninject请求创建一个类型时,Ninject会去检查该类型和其他类型之间的耦合关系.如果有额外的依赖,Ninject也会解析它们 ...
- IOC框架之Ninject 简介
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 上篇博客介绍了依赖注入的三种方式:构造方法注入,属性注入,接口注入!详情请参考 ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)
前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- Ninject学习笔记<四>
前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...
- IoC原理及实现
什么是IoC IoC是Inversion of Control的缩写,翻译过来为"控制反转".简单来说,就是将对象的依赖关系交由第三方来控制.在理解这句话之前,我们先来回顾一下I ...
- C# Ninject使用
Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置.简单来讲就是 为我们选择一个想要的类来处理事务. 百度百科的解释:一个快如闪电.超轻量级的基于.Net平台的依赖 ...
随机推荐
- 小数点保留n位有效数字
char *psf = "183.0000000000000001"; ]; sprintf(chBuff, "%.2lf", atof(psf)); doub ...
- IO多路复用和local概念
一.local 在多个线程之间使用threading.local对象,可以实现多个线程之间的数据隔离 import time import random from threading import T ...
- Django JSON,AJAX
JSON 概念 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具 ...
- LoadRunner【第五篇】关联
关联的定义及使用场景 关联:将服务器提供动态变化的值存放在变量中,当需要使用该变量时,由LoadRunner自动从服务器响应的信息中获取该值,并在后面使用的过程中进行替换.(也可能是前端页面动态生成的 ...
- BSGS与扩展BSGS
BSGS \(BSGS\)算法又称大步小步\((Baby-Step-Giant-Step)\)算法 \(BSGS\)算法主要用于解以下同余方程 \[A^x\equiv B(mod\ p)\]其中\(( ...
- .pyc是个什么 python的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- BZOJ 3674 可持久化并查集
https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化数组维护并查集的fa数组, 查询时间复杂度为nlognlogn,一个log是并查集 ...
- 第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。
一. 传统的线程取消 所谓的线程取消,就是线程正在执行的过程中取消线程任务. 传统的线程取消,是通过一个变量来控制,但是这种方式,在release模式下,被优化从cpu高速缓存中读取,而不是从内存中读 ...
- Aurora — 一个在 MSOffice 内输入 LaTeX 公式的很好用插件
from http://blog.csdn.net/GarfieldEr007/article/details/51452986 工具名称:Aurora2x (下载) 压缩包内有详细的安装说明. 刚 ...
- [物理学与PDEs]第3章第5节 一维磁流体力学方程组 5.1 一维磁流体力学方程组
1. 当磁流体力学方程组中的量只依赖于 $t$ 及一个空间变量时, 该方程组称为一维的. 2. 一维磁流体力学方程组 $$\beex \bea \cfrac{\p H_2}{\p t}& ...