先概括Dependency Injection也就是依赖注入:一种设计模式,当类设计中使用到某种其它的类或插件类时,是通过对象引用而不是直接创建对象来实现的,在声明的时候,只需确定接口或者基类就可以了。
引用概念提出者martin fowler的原图,在一种设计模式下,一个类可以在类的定义里面去创建和使用另一个类,例如:
这里MovieLister类创建了MovieFinderImpl类,而MovieFinderImpl类实现了MovieFinder的接口。这种情况下,如果MovieLister如果要使用其他实现MovieFinder接口的类,就不得不改变创建对象的实现。比如,原来是new MovieFinderImpl_1(),现在是new MovieFinderImpl_2()。
而依赖注入的设计方法引入了一个“注入点”的概念,把依赖关系独立到另外的部分,而不是MovieLister本身的实现中来做,MoviewLister这个类不需要关心最终使用的是哪个MovieFinder的实现类。依赖注入的关系图如下:
在上面的图里面,我们可以看到,我们只规定MovieLister依赖于MovieFinder,而具体有哪些对MovieFinder的实现类,我们并不关心。具体的对象创建和传入都是由Assembler来处理的。这样一来,我们可以保证MovieLister本身对于MovieFinder扩展时表现的可扩展性。
在广义上,Dependency Injection也是Inversion of Control(IoC)的一种。Dependency Injection在查找/使用插件类的时候,控制反转了,一般的模式(第一幅图)是MovieLister进行控制,而依赖注入模式下,是由Assembler进行控制,相对于MovieLister来说,控制方向变化了。
有两篇关于依赖注入的文章写得比较好,一篇是martin fowler的原文,另一篇是中文的,例子写得也比较好。
1. http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html
2. http://www.martinfowler.com/articles/injection.html