现在的位置: 首页 > 综合 > 正文

Ninject学习_Preparing

2012年12月26日 ⁄ 综合 ⁄ 共 1509字 ⁄ 字号 评论关闭

说实话以前只知道依赖注入和控制反转,还没听过Ninject,最近在看Mvc3的书,看到Ninject,所以就抽时间学一下。

其实,Ninject也没什么神秘的,他只是一个简单框架用来辅助实现依赖注入(控制反转)的,有一点大家应该比较欣慰他是开源的,.NET中开源的东西可真不多。

要学习Ninject首先应该了解依赖注入和控制反转(相同的东西,不同的叫法):

 控制反转(Inversion of Control),先按照我自己理解说说IOC的由来吧,

假如我们要做一个电子商务网站,这必然需要用到支付,我们设计一个Customer的类,起初可能只支持一个银行的支付所以我们会有如下的设计:

public class Customer
    {

 

        private BankIcbc _bank = new BankIcbc();

 

        public void Pay(decimal dMoney)
        {
           

              _bank.Pay(dMoney);

        }

    }

但是随着业务的发展可能会支持更多的银行的支付,这时我们便会发现上面的设计是不太现实的,太繁琐了,不能把所有银行的Entity都实例化后放在Customer类中,

所以我们就想可以通过Constuctor传递银行的Entity实例,改进如下:

 

 public class Customer
    {
        public void PayICBC(decimal dMoney, BankIcbc bank)
        {
            bank.Pay(dMoney);
        }
        public void PayCCB(decimal dMoney, BankCCB bank)
        {
            bank.Pay(dMoney);
        }

        ……

    }

 而此时其实也算是一次IOC(控制反转),通过Constuctor来完成的,虽然还有待改进。但根据这个例子我们可以看看这个“反转”是如何完成的:

 

本来进行何种银行的支付是Customer类控制的,而现在则是通过构造函数传入的Bank实体来控制的,是由调用方来控制的,控制就这样反转了!It's so easy!

当然这个代码还是不符合规范的,既然 pay是一个相似的动作,当然应该抽象成Inerface,让每个BankEntity都implement这个Interface:

 

 public class Customer
    {
        public void Pay(IBankPay bank)
        {
            bank.pay();
        }

    }

 

 这其实也是IOC,只不过是通过接口完成的罢了。

至于依赖注入,和控制反转是一个东东,只不过是从依赖的角度来看待这个问题罢了,像上面的例子就是:本来进行何种支付是依赖于Customer类本身的,而后来是

依赖通过构造函数传进来的BankEntity或者IBankPay的,而这个依赖是外部传入的(Inject注入),所以就叫依赖注入了。

 

说完了IOC和Dependency Inject,再简单的说一下Ninject,我觉得他就是一个我们来实现IOC和Dependency Inject的一个中间工具,他使我们的调用更简单,代码更简洁了。

 详细的以后再说,我也是刚开始了解Ninject,说实话以前挺抵触IOC的,因为每次修改实现类的代码时,要找到源代码很繁琐,一F12就到定义的接口中了,相当不爽!

 

以上都是我自己的理解如有瑕疵请大家指点迷津。

 

 

 

 

 

抱歉!评论已关闭.