关于依赖注入的一点认识(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的使用。
以上是个人的不成熟想法,还希望大家多多指教。