为什么要使用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中地精的话语:时间就是金钱~~~ 好公司加班给钱的哦。。。 虽然还是很悲催~~~
 
posted @ 2012-03-24 01:54  陈卓杰  阅读(615)  评论(0编辑  收藏  举报