为什么要使用Ninject
模块化
如果一但你把应用程序分为多个组件或者模块,你必须得组合它们。控制反转可以解决这个问题。这个比搭线式或者依靠一串的XML来描述组件要好的多。(用XML来描述是控制反转一种实现方式,我们的目的是组合组件,控制反转是达成目标的理论,Ninject和XML描述都是属于解决方案。当然还会有很多的解决的手段!!所以希望大家理性思考,选择最适合的,这里不是一篇推荐使用Ninject的文章,仅仅向大家介绍或者说是自我学习的文章,有点啰嗦了~~~)
2为什么不选择其他的控制反转的工具?
1 因为大多数其他的框架都是使用XML的方式来通知框架构建应用程序,所以Ninject最少会有下面几个优势:
第一:配置会非常的繁琐并且经常得提供出装配件(一般来说都是DLL)的Type全名。
如:System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
第二: 一个小小的错误,你的程序就会出问题。。。 想想看,PublicKeyToken变了后,啥都不会了- - 特别是做一些类似MOSS中插件开发,
如WebPart经常会出错。好吧,MOSS中使用Ninject会是啥结果,还不清楚。。。。
解释下轻量级和重量级的区别:
最最显著的就是:受重量级的框架,会造成需要依赖很多的组件。
2 Ninject默认的工作方式:
使用Fluent Interface的方式进行类型绑定,有个更专业的描述:embedded domain-specific language 嵌入式领域语言
例子:
我们有一个接口IService和它的实现ServiceImpl
,假设我们任何时候请求IService的实例都是ServiceImpl类,那么我们可以这么定义
Bind<IService>().To<ServiceImpl>();
2 第二种:有个好听的名字,contextual binding,上下文绑定。相对于一些字符串、标识符来说,Ninject可以做到根据不同的环境来给予不同的接口实现。
Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>(); Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>(); class ConsumerA { public ConsumerA([Red] IService service) { // The "service" argument will be an instance of RedImpl. } } class ConsumerB { public ConsumerB([Blue] IService service) { // The "service" argument will be an instance of BlueImpl. } }
3 好吧,真的非常的轻量级,核心DLL程序只有100KB。
4 。。。。自己体会吧,支持TDD,当然这个项目使用的是xUnit.net
5 支持很多的平台,SL,Mono,WP,ASP.NET MVC……. 嗯一次学习,其他的项目就会用了,不会出啥问题,学习成本较低 ~~~ 囧 喜欢折腾自己的可以多学习点 ,还是喜欢WOW中地精的话语:时间就是金钱~~~ 好公司加班给钱的哦。。。 虽然还是很悲催~~~