Ninject是C#语言的一款依赖性的注入器框架,我认为之所以会出现这个框架是因为类与类由于继承或者接口与类继承而出现的,首先这
个最典型存在是因为接口,首先我们来看看这个用了框架和没有用框架的区别吧。
首先声明一个IDiscountHeler接口,然后用一个类继承接口
public interface IDiscountHelper { int ApplyDiscount(int totalParm); } public class DeafaultDiscountHelper : IDiscountHeler { public int ApplyDiscount(int total) { return (int)(0.9 * total); } }
我们在控制台程序里面声明这个接口,但是如何我们想实现IDisountHelper的一个实例,我们必须要创建继承IDiscountHelper的一个类
,就像这样IDiscountHelper discount=new DeafaultDiscountHelper( );现在我们来介绍一下Ninject,看看他如何实现上面的对
IDiscountHelper接口的实例的创建,Ninject是一个容器,这个容器可以帮我们处理文件的由于继承而产生的依赖,从而返回一个我们
想要的实例,对他的作用就是返回一个实例,我们看看他实现的代码,首先你得下一个Ninject的包,网上有很多教程,这里就不详细讲
。
-------- using Ninject; -------- -------- IKernel ke = new StandardKernel();//Ikernel是Ninject的核心组件,通过创建这个实例来调用Ninject框架 ke.Bind<IDiscountHeler>().To<DeafaultDiscountHelper>();//将DeafaultDiscountHelper绑定到IDiscountHeler接口上 IDiscountHeler cd= ke.Get<IDiscountHeler>();//用ke返回接口的实例 Console.WriteLine(cd.ApplyDiscount(20));//调用接口的方法 返回结果18
我们通过Ninject成功将一个接口的给间接实例化,这个代码看起来比上面一行代码(IDiscountHelper discount=new
DeafaultDiscountHelper( ))累赘的多,但是假如有很多依赖性复杂关系时,这个就框架的作用就非常明显了。
接下来看看下面代码,再声明一个类
public class LinqValue { private IDiscountHeler discounter; public LinqValue(IDiscountHeler dis) { discounter = dis; } public int value(int m){ return discounter.ApplyDiscount(m); } }
现在我们要创建的这个类的实例时我们不用框架要怎么做,
IDiscountHelper discount=new DeafaultDiscountHelper( ); LinqValue li=new LinqValue(discount);
我们只有经过上面两个步骤时才可以使用LinqValue的value方法,当然一个这样看起来还挺轻松但是如果我们的项目比较大的时候我们
就非常费力了,我们只有用一行代码就可以实现上面的功能(已绑定接口)
LinqValue li=ke.Get<LinqValue>();这个看起来很不可思议我们只是请求LinqValue这个类Ninject就帮我们把其中的依赖接口的实例绑
定好了,我们直接可以使用li.value(20)就可以返回结果,其实第一次看到这个框架时并没有发觉它的强大,后来在使用的过程中发现这
个框架非常强大,它成功的实现了DI的设计理念,把文件的依赖性分离,我们使用LinqValue是为了实现通用性,利用接口的这个抽象类
将类中的方法实现了通用性,当我们想使用不同的继承接口的类的来调用其方法,我们可以将Ninject绑定到不同的地方。Ninject是一个
开源框架,我们可以从github上下载源代码研究。