本文参考:http://www.cnblogs.com/willick/p/3223042.html

1、Ninject是一款轻量级的DI工具,可通过VS的插件NuGet将其引用到项目中。

2、使用Ninject的步骤:

  • 创建一个Ninject的内核对象
//创建Ninject内核实例
IKernel ninjectKernel = new StandardKernel();
  • 把公开接口绑定到一个实现了该接口的类上
//绑定接口到实现了该接口的类。这种绑定告诉Ninject,当接收到一个请求IValueCalculator的实现时,返回一个LinqValueCalcutor的实例
ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator<();
  • 使用Ninject的Get方法获取公开接口的实现
// 获得实现接口的对象实例。Ninject将自动为我们创建LinqValueCalculator类的实例,并返回该实例的引用
IValueCalculator calcImpl = ninjectKernel.Get<IValueCalculator>();
  • 调用接口实现类的方法
// 创建ShoppingCart实例并注入依赖
ShoppingCart cart = new ShoppingCart(calcImpl);
// 计算商品总价钱并输出结果
Console.WriteLine("Total: {0:c}", cart.CalculateStockValue());

3、当请求Ninject创建某个类型的实例时,它会检查这个类型和其它类型之间的耦合关系。如果存在依赖关系,那么Ninject会根据依赖处理理它们,并创建所有所需类的实例。

4、Ninject绑定时为属性赋值(支持链式语法):

ninjectKernel.Bind<IDiscountHelper>().To<DefaultDiscountHelper>().WithPropertyValue("DiscountSize", 5M).WithPropertyValue("DiscountSize2", 5M);

5、Ninject绑定时为构造函数传参(支持链式语法):

ninjectKernel.Bind<IDiscountHelper>().To< DefaultDiscountHelper>().WithConstructorArgument("discountParam", 5M).WithConstructorArgument("discountParam2", 5M);

6、Ninject的自绑定:

//没有构造函数参数、属性需要赋值时刺句可省略
ninjectKernel.Bind<ShoppingCart>().ToSelf(); //这种写法不需要关心ShoppingCart类依赖哪个接口,也不需要手动去获取该接口的实现(calcImpl)。
//当通过这句代码请求一个ShoppingCart类的实例的时候,Ninject会自动判断依赖关系,并为我们创建所需接口对应的实现。
ShoppingCart cart = ninjectKernel.Get<ShoppingCart>();

7、Ninject的派生类绑定:

//派生类绑定,其中LimitShoppingCart是ShoppingCart的子类
ninjectKernel.Bind<ShoppingCart>().To<LimitShoppingCart>().WithPropertyValue("ItemLimit", 3M);

8、Ninject的条件绑定:

//条件绑定,IValueCalculator接口现在有两个实现:IterativeValueCalculator和LinqValueCalculator。
//下列语句意思是:如果是把该接口的实现注入到LimitShoppingCart类,那么就用IterativeValueCalculator,其他情况都用LinqValueCalculator。
ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
ninjectKernel.Bind<IValueCalculator>().To<IterativeValueCalculator>().WhenInjectedInto<LimitShoppingCart>();

【ASP.NET MVC 学习笔记】- 05 依赖注入工具Ninject的更多相关文章

  1. Asp.net core 学习笔记 ( DI 依赖注入 )

    比起 Angular 的依赖注入, core 的相对简单许多, 容易明白 所有 provider 都在 startup 里配置. public void ConfigureServices(IServ ...

  2. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  3. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  4. ASP.NET MVC学习笔记-----Filter2

    ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...

  5. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  6. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  7. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  8. 【ASP.NET MVC 学习笔记】- 04 依赖注入(DI)

    本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种"需 ...

  9. Asp.Net Mvc使用Autofac实现依赖注入

    在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IPeople : public class AutoFacController : C ...

随机推荐

  1. [06] Session实现机制以及和Cookie的区别

    1.为什么有Session和Cookie 根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接.TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于 ...

  2. Java通过链表实现队列

    class LinkedQueue<T> { /** * 队列大小,由构造函数初始化 */ private int maxSize; /** * 队头 */ private Node fr ...

  3. PHP中foreach循环传值问题

    首先看一段代码: <?php $a=array('ab','cd','ef'); $count=3; foreach($a as $key=>$value){ $value='abcdef ...

  4. 简易RPC框架-私有协议栈

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. node.js的generic-pool与mysql结合,mysql连接池

    var generic_pool = require('generic-pool'); var pool = generic_pool.Pool({     name: 'mysql',     ma ...

  6. js时间戳和日期字符串相互转换

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  7. 1297. Palindrome ural1297(后缀数组)

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  8. Theano学习-scan循环

    \(1.Scan\) 通用的一般形式,可用于循环 减少和映射(对维数循环)是特殊的 \(scan\) 对输入序列进行 \(scan\) 操作,每一步都能得到一个输出 \(scan\) 能看到定义函数的 ...

  9. 对Jquery中的ajax再封装,简化操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. mac idea sbt工程打jar包

    1.首先保证sbt已下载,否则下载homebrew:在命令行输入/usr/bin/ruby XXX ->下载完成后在终端输入brew install sbt ->安装完毕后可以打jar包 ...