最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结。首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦。我喜欢前一段时间看EF的CodeFirst的那种模式,一切尽在代码控制;其次要轻,框架里面的大多数功能我能用上多少呢?甚至于可能你永远都不会知道。尝试过自己实现了简单的IoC功能,也的确在很多项目用到了,但是对于自己的能力还是有所了解的,更希望还是能找到一个轻量,功能够用,易于使用的。查了很久,无意间,看到MVC4中有提到了这个框架:Ninject。留意,看了不少介绍,好象是我想要的。

网上的资料很少,太简单。上官网看,全英文,慢慢看吧,同时简单的翻译一部份有用的,放在这里,算翻译么?也不算,也算是原创吧,必竟有大量自己的理解。

错误肯定有,可能也会摘一些其他文章中的部份文字,如果不同意,告诉我,我删除掉就是了。好了,开始吧。


如果想让程序脱离耦合,就必须使用IoC容器来解决这个问题。Ninject就是这样一个容器。

Ninject不是第一个IoC容器,也一定不会是最后一个,那么Ninject的设计初衷是什么呢?

首先,其他框架过于依赖配置文件。这至少有下述的一些缺点:

配置更为复杂和冗长的;你需要提供assembly-qualified名称来进行定义,这很容易破坏你的应用程序而仅仅是因为一个简单的打字错误。相比之下,Ninject默认的做法是通过接口来进行类型绑定。

例如:你想将 ServiceImpl 的实现进行它所属的接口 IService:

  1. Bind<IService>().To<ServiceImpl>();

其次,许多其他的框架太过重量,这将意味着你的项目需要添加一些非常多的组件引用,或依赖于各种框架组件。对于较小的项目,这可能会导致“膨胀”。ninject旨在让事情简单明了。

第三,Ninject 推出一个概念的定义:上下文绑定(Contextual Binding)。它将不是基于字符串标识的绑定,Ninject可以运行期间灵活的进行条件化的绑定,例如:

  1. Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>();
  2. Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>();
  3. class ConsumerA
  4. {
  5. public ConsumerA([Red] IService service)
  6. {
  7. //因为加上了"Red"定制特性,通过方法注入"IService"的实现将是RedImpl
  8. }
  9. }
  10. class ConsumerB
  11. {
  12. public ConsumerB([Blue] IService service)
  13. {
  14. //因为加上了"Blue"定制特性,通过方法注入"IService"的实现将是BlueImpl
  15. }
  16. }

Ninject 的重要特点:重量轻,高度模块化框架

有一些 Ninject 自已总结的特点,我认为很重要:

  1. 紧凑
  2. 高度一致
  3. 测试驱动开发,并且最大化的单元测试覆盖率
  4. 当说明文档看不明白时,大量的测试代码就是最好的例子

Ninject 支持 Silverlight, Mono, WP7.5,.NET 4.0, MVC3, 以及 WinRT的预览支持。

重要的还包括,Ninject 的扩展已经非常多了:

and more…

    • Ninject.Web.Common  :用于Web扩展和WCF的扩展。
    • Ninject.Web.Mvc:  用于ASP.NET MVC。
    • Ninject.Web  :用于ASP.NET WebForm。
    • Ninject.Extensions.Wcf :支持WCF。
    • Ninject.Extensions.Conventions: 提供配置,用于修改Ninject的默认约定。
    • Ninject.Extensions.Factory:  用于自动创建工厂和实例对象。
    • Ninject.Extensions.Interception: 用于拦截。
    • Ninject.Extensions.NamedScope :允许绑定定义范围.
    • Ninject.Extensions.ContextPreservation: 用于上下文的保存。 经常和NameScope结合起来一起用。
    • Ninject.Extensions.ChildKernel:为Ninject提供内核定义。
    • Ninject.Extensions.DependencyCreation:
    • Ninject.Web.Mvc.FluentValidation:用于MVC Fluent Api的验证。
    • Ninject.Extensions.Logging: 日志记录。
    • Ninject.Extensions.bbvEventBroker:
    • Ninject.Extensions.WeakEventMessageBroker:
    • Ninject.Extensions.MessageBroker:消息代理。
    • Ninject.Extensions.Xml: 基于XML的模块加载Ninject。
    • Ninject.MockingKernel:  用于模拟。
    • Ninject.Extensions.WF:用于支持工作流。

Ninject.Extensions.的更多相关文章

  1. Ninject之旅之十一:Ninject动态工厂(附程序下载)

    摘要 如果我们已经知道了一个类所有的依赖项,在我们只需要依赖项的一个实例的场景中,在类的构造函数中引入一系列的依赖项是容易的.但是有些情况,我们需要在一个类里创建依赖项的多个实例,这时候Ninject ...

  2. Ninject之旅之六:Ninject约定

    摘要 在小的应用系统中一个一个注册一些服务类型不怎么困难.但是,如果是一个实际的有上百个服务的应用程序呢?约定配置允许我们使用约定绑定一组服务,而不用一个一个分别绑定. 要使用约定配置,需要添加Nin ...

  3. Ninject之旅之五:Ninject XML配置

    摘要 使用XML配置,需要添加Ninject XML扩展的引用.下一步是添加一个或多个包含类型注册的XML文件.记得这些文件应该跟应用程序一起发布.因此不要忘记将XML文件的属性设置成“Copy if ...

  4. Ninject学习笔记<二>

    本文转载自kuangkro 如果给您带来不便请联系博主 一.控制反转和依赖注入 Ninject是一个轻量级的基于.Net平台的依赖注入(IOC)框架.所谓的IOC,即控制反转(Inversion of ...

  5. Ninject学习笔记<一>

    本文转载自永远的阿哲 如果给您带来不便请联系博主. Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替 ...

  6. IOC框架Ninject实践总结

    原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...

  7. Ninject 自动注册

    首先这个问题我纠结了很久,看到autofac强大的自动注册功能,我感觉Ninject弱爆了,不过Ninject自带属性注册,感觉很方便,所以还在纠结Ninject 传统的绑定方式 public cla ...

  8. ASP.NET MVC IOC 之Ninject攻略

    ASP.NET MVC IOC 之Ninject攻略 一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualifie ...

  9. Ninject是一款.Net平台下的开源依赖注入框架

    Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替Xml文件完成类型绑定.Ninject结构精巧,功能 ...

随机推荐

  1. winmd文件和dll文件的区别

    今天在研究一个二维码项目,用到一个第三方组件 ZXing,因为做的是Windows应用商店程序,应用商店程序是可以引用winmd文件也可以引用dll文件,但是这两种文件ZXing都提供了,最后和同事讨 ...

  2. 记录一次有用的stackoverflow搜索

    经常逛stackoverflow有一段时间了,也遇到了不少问题 问题: 1.ckeditor中在source中输入如下代码 2.再点击source按钮,查看页面显示效果,不对啊 3.然后再检查源码,发 ...

  3. Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

    原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...

  4. HDU ACM 1068 最大独立集

    意甲冠军:n同学.有些学生将有宿命的男性和女性成为恋人.收集注定要成为爱好者求学生的最大数目不存在. 分析:独立设置,顶点设定图的一个子集,在休闲2不连续: 二分图:最大独立集 = 顶点 - 匹配的最 ...

  5. robot framework-databaselibaray库使用(python)(转)

    公司做项目用到了databaselibaray,刚开始使用时碰到了很多问题,网上也查阅了很多资料终于是可以用了,现在整理记录下来,有需要的同学可随意使用: 另,本文主要是databaselibaray ...

  6. C++ - new与malloc的差别

    malloc是C++语言的标准库函数:而new是C++语言中的操作符. new返回指定类型的指针,而且能够自己主动计算所需空间的大小:而malloc必需要由用户自己计算所需空间大小,并在返回后强行转换 ...

  7. hdu 4115 石头剪子布(2-sat问题)

    /* 意甲冠军:石头剪子布,目前已知n周围bob会有什么,对alice限制.供u,v,w:设w=0说明a,b回合必须出的一样 否则,必须不一样.alice假设输一回合就输了,否则就赢了 解: 2-sa ...

  8. hdu Simpsons’Hidden Talents(kmp)

    Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’ ...

  9. VS2013打包部署(图解)

    首先要说明的是VS解决方案的配置Debug模式和Release有什么区别模式.Debug模式通常被称为调试模式,它包括调试信息,不优化的代码,序:Release模式通常叫做公布模式.不包括调试信息,可 ...

  10. python test0729.py

    #!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requests ...