为什么使用Ninject?
最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结。首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦。我喜欢前一段时间看EF的CodeFirst的那种模式,一切尽在代码控制;其次要轻,框架里面的大多数功能我能用上多少呢?甚至于可能你永远都不会知道。尝试过自己实现了简单的IoC功能,也的确在很多项目用到了,但是对于自己的能力还是有所了解的,更希望还是能找到一个轻量,功能够用,易于使用的。查了很久,无意间,看到MVC4中有提到了这个框架:Ninject。留意,看了不少介绍,好象是我想要的。
网上的资料很少,太简单。上官网看,全英文,慢慢看吧,同时简单的翻译一部份有用的,放在这里,算翻译么?也不算,也算是原创吧,必竟有大量自己的理解。
错误肯定有,可能也会摘一些其他文章中的部份文字,如果不同意,告诉我,我删除掉就是了。好了,开始吧。
如果想让程序脱离耦合,就必须使用IoC容器来解决这个问题。Ninject就是这样一个容器。
Ninject不是第一个IoC容器,也一定不会是最后一个,那么Ninject的设计初衷是什么呢?
首先,其他框架过于依赖配置文件。这至少有下述的一些缺点:
配置更为复杂和冗长的;你需要提供assembly-qualified名称来进行定义,这很容易破坏你的应用程序而仅仅是因为一个简单的打字错误。相比之下,Ninject默认的做法是通过接口来进行类型绑定。
例如:你想将 ServiceImpl 的实现进行它所属的接口 IService:
- Bind<IService>().To<ServiceImpl>();
其次,许多其他的框架太过重量,这将意味着你的项目需要添加一些非常多的组件引用,或依赖于各种框架组件。对于较小的项目,这可能会导致“膨胀”。ninject旨在让事情简单明了。
第三,Ninject 推出一个概念的定义:上下文绑定(Contextual Binding)。它将不是基于字符串标识的绑定,Ninject可以运行期间灵活的进行条件化的绑定,例如:
- Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>();
- Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>();
- class ConsumerA
- {
- public ConsumerA([Red] IService service)
- {
- //因为加上了"Red"定制特性,通过方法注入"IService"的实现将是RedImpl
- }
- }
- class ConsumerB
- {
- public ConsumerB([Blue] IService service)
- {
- //因为加上了"Blue"定制特性,通过方法注入"IService"的实现将是BlueImpl
- }
- }
Ninject 的重要特点:重量轻,高度模块化框架
有一些 Ninject 自已总结的特点,我认为很重要:
- 紧凑
- 高度一致
- 测试驱动开发,并且最大化的单元测试覆盖率
- 当说明文档看不明白时,大量的测试代码就是最好的例子
Ninject 支持 Silverlight, Mono, WP7.5,.NET 4.0, MVC3, 以及 WinRT的预览支持。
重要的还包括,Ninject 的扩展已经非常多了:
- ninject.web.mvc
- ninject.extensions.interception
- ninject.extensions.wcf
- ninject.extensions.logging
- ninject.extensions.conventions
- ninject.extensions.xml
- ninject.extensions.messagebroker
- ninject.extensions.weakeventmessagebroker
- ninject.moq
- 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的文章,都是极度入门级,实在用处不大。但我想我这个系列不讲这一段也不对,因为这一段是对Ninject的初窥吧。 好了让我们从代码来看吧,我的介绍会都放在注释中。 public interface IPerson { } public class ZhangF...最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结。首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦。我喜欢前一段时间看EF的CodeFirst的那种模式,一切尽在代码控制;其次要轻,框架里面的大多数功能我能用上多少呢?甚至于可能你永远都不会知道。尝试过自己实现了简单的IoC功能,也的确在很多项目用到了,但是对于自己的能力还是有所了解的,更希望还是...
为什么使用Ninject?的更多相关文章
- Ninject学习(一) - Dependency Injection By Hand
大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...
- ASP.NET MVC学前篇之Ninject的初步了解
ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...
- [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
本人博客已转移至:http://www.exblr.com/liam 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...
- [ASP.NET MVC 小牛之路]05 - 使用 Ninject
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
- 依赖注入(DI)和Ninject,Ninject
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(六)
前言 在接下来的篇幅里将对系统的模块功能进行编写.主要以代码实现为主.这一篇我们需要完成系统模块“角色管理”的相关功能.完成后可以对系统框架结构有进一步了解. Abstract层 之前说过,Abstr ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)
前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...
- Ninject使用介绍
#region 第二种写法 /// <summary> /// using(IKernel tKernel=new StandardKernel(new PeoKernelServer() ...
- 使用Ninject进行DI(依赖注入)
Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...
- Ninject之旅之十一:Ninject动态工厂(附程序下载)
摘要 如果我们已经知道了一个类所有的依赖项,在我们只需要依赖项的一个实例的场景中,在类的构造函数中引入一系列的依赖项是容易的.但是有些情况,我们需要在一个类里创建依赖项的多个实例,这时候Ninject ...
随机推荐
- linux 安装jdk-7u45-linux-x64.tar.gz
1.官网下载jdk-7u45-linux-x64.tar.gz 载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- 飞天熊猫游戏源代码android文本
这款游戏是前一段时间完毕的一个项目,飞行熊猫游戏源代码android版.飞行熊猫基于cocos2d游戏引擎开发.包含了谷歌admob广告支持,没有不论什么版权问题.大家能够自由改动和上传应用商店. 1 ...
- Android 最热的高速发展框架XUtils
近期搜了一些框架供刚開始学习的人学习,比較了一下XUtils是眼下git上比較活跃 功能比較完好的一个框架,是基于afinal开发的,比afinal稳定性提高了不少.以下是介绍: 鉴于大家的热情,我又 ...
- ios正在使用NSDateComponents、NSDate、NSCalendar它的结论是在当前时间是在一段时间在一天。
一般应用程序设置这一组的存在,比如夜间模式,如果你.从8:00-23:00.在这个当前的时间是如何推断出期间.主要的困难在于如何使用NSDate生成8:00时间和23:00时间.然后用当前时间,也许有 ...
- 移动web开发经验总结(1) (转)
1.<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-sca ...
- ServiceStack.Redis——Redis于.net向上client解
ServiceStack.Redis--Redis于.net向上client解 源代码和使用: https://github.com/ServiceStack/ServiceStack.Redis 样 ...
- HTML5 Introduction
1. HTML5 History HTML4.01 –1999.12 HTML5 – 2014.10– Done (8 years) In2006, WHATWG&W3C, decide to ...
- do{}while(0)宏的作用的定义
看到开放源代码,宏定义经常这样用 #define some() do { do_somt_thing(); } while (0) 为什么这样用? 能够试一下.假如一个普通宏定义 #define so ...
- SlidingMenu 左侧滑动菜单
1.MainActivity package loveworld.slidingmenu; import java.util.ArrayList; import android.app.Activit ...
- C#操作Xml:XPath语法 在C#中使用XPath示例
XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...