profile for Macon_Cao at Stack Overflow, Q&A for professional and enthusiast programmers
随笔 - 130  文章 - 0  评论 - 195  阅读 - 13万

关于依赖注入的一点认识(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   涵树  阅读(2039)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
< 2010年1月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示