说实话以前只知道依赖注入和控制反转,还没听过Ninject,最近在看Mvc3的书,看到Ninject,所以就抽时间学一下。
其实,Ninject也没什么神秘的,他只是一个简单框架用来辅助实现依赖注入(控制反转)的,有一点大家应该比较欣慰他是开源的,.NET中开源的东西可真不多。
要学习Ninject首先应该了解依赖注入和控制反转(相同的东西,不同的叫法):
控制反转(Inversion of Control),先按照我自己理解说说IOC的由来吧,
假如我们要做一个电子商务网站,这必然需要用到支付,我们设计一个Customer的类,起初可能只支持一个银行的支付所以我们会有如下的设计:
{
public void Pay(decimal dMoney)
{
_bank.Pay(dMoney);
}
}
但是随着业务的发展可能会支持更多的银行的支付,这时我们便会发现上面的设计是不太现实的,太繁琐了,不能把所有银行的Entity都实例化后放在Customer类中,
所以我们就想可以通过Constuctor传递银行的Entity实例,改进如下:
{
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:
{
{
bank.pay();
}
}
这其实也是IOC,只不过是通过接口完成的罢了。
至于依赖注入,和控制反转是一个东东,只不过是从依赖的角度来看待这个问题罢了,像上面的例子就是:本来进行何种支付是依赖于Customer类本身的,而后来是
依赖通过构造函数传进来的BankEntity或者IBankPay的,而这个依赖是外部传入的(Inject注入),所以就叫依赖注入了。
说完了IOC和Dependency Inject,再简单的说一下Ninject,我觉得他就是一个我们来实现IOC和Dependency Inject的一个中间工具,他使我们的调用更简单,代码更简洁了。
详细的以后再说,我也是刚开始了解Ninject,说实话以前挺抵触IOC的,因为每次修改实现类的代码时,要找到源代码很繁琐,一F12就到定义的接口中了,相当不爽!
以上都是我自己的理解如有瑕疵请大家指点迷津。