profile for Macon_Cao at Stack Overflow, Q&A for professional and enthusiast programmers

关于依赖注入的一点认识(Dependency Injection)

学习Smart Client,免不了要碰到Dependency Inject。

关于Dependency Inject,推荐阅读 Martin Fowler的Dependency Inject

以前也不止一次地听说过依赖注入,但是没有专门花时间去研究,今天看完的第一个感受就是在玩地址游戏。

例如,我们在代码中定义一个变量。

ObjX x = new ObjX();

x.DoSomething();

这里,我们获得了一个x的地址,而这个地址直接指向ObjX的实例。而当前代码的上下文就直接依赖于ObjX。而这种依赖的实际意义就是将DoSomething的逻辑定义和DoSomething的逻辑实现绑定在一起。

当有一天,我们需要将DoSomething的逻辑定义用另外一种逻辑实现来实现时,接口就被引入。

IObjX x = new ObjX1();

x.DoSomething();

这里,我们同样获得了一个x的地址,而这个地址指向ObjX1的实例。虽然代码的上下文还是直接依赖于XObj1()。而这种依赖和上面的依赖相比有了不同,它是通过接口来实现的依赖。DoSomething的逻辑定义可以通过接口绑定到各种逻辑实现上。

人类总是有更多的需求,而这种需求往往会促使新事物的诞生。

有人就索性只在上下文的代码中只定义接口,即只有IObjX,而关于IObjX的实现,则完全不管,并将其编译为二进制组件发布。而关于IObjX的实现,则通过依赖注入的方式,在该组件被使用时,动态加载。这里,我个人觉得对IObjX的使用,就是为了获得一个逻辑层面的地址,然后再运行时,再将该逻辑地址映射到一个实际的实例地址上。

关于依赖注入的原理看似简单,但是如何实现运行时逻辑地址与实例地址的绑定,可谓是百花齐放,百家争鸣。

我会在后来的blog中阐述一下MEF的使用。

以上是个人的不成熟想法,还希望大家多多指教。

posted on 2010-01-24 13:43  无所畏惧,有所期待  阅读(2036)  评论(3编辑  收藏  举报