Dependency Injection是什么东东?哪位能举个通俗易懂的小例子吗?

nanhe0065 2010-06-25 02:43:09
为什么要用到它?
什么情况下是非要用到它不可?
...全文
770 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dazhabai 2010-06-28
  • 打赏
  • 举报
回复
dazhabai 2010-06-28
  • 打赏
  • 举报
回复
依赖注入的就是(我的看法)你写一个方法,但是参数是接口,别人调你的这个方法的时候,需要先实例化一个对象,改对象实现了这个接口,然后将这个对象作为参数传进去。
企-鹅 2010-06-27
  • 打赏
  • 举报
回复
我不懂C#,不过我想学,哥,以后遇到不懂的我问你啊...

想弄个CSDN回帖机器人,以前用的机器人不好用,马甲因此都被封杀了..

我要优化一下机器人..继续壮大马甲队伍....
企-鹅 2010-06-27
  • 打赏
  • 举报
回复
哥,5楼也是我....
nanhe0065 2010-06-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangheng0624 的回复:]
在博客园搜了一下,其实我不懂,我是来帮我哥顶帖的...
[/Quote]
谢谢企鹅,Martin Fowler很出名啊。最近看WPF的MVVM模式,里边提到的Presentation Model好像就是Martin Foweler 2004年提出来的。谢谢你5楼发的那个链接。
企-鹅 2010-06-27
  • 打赏
  • 举报
回复
在博客园搜了一下,其实我不懂,我是来帮我哥顶帖的...
企-鹅 2010-06-27
  • 打赏
  • 举报
回复
企-鹅 2010-06-27
  • 打赏
  • 举报
回复
Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。后被
Martin Fowler改名为 Dependency Injection 依赖注射,也就是将类之间的关系通过第三方进行注射,不需要类自己去解决调用关系。
AInterface a = new AInterfaceImp();
AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。
其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。
  但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。

在通常传统情况下,为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。
-----------------------
例如,我们在代码中定义一个变量。

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的使用,就是为了获得一个逻辑层面的地址,然后再运行时,再将该逻辑地址映射到一个实际的实例地址上。

xy325432 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lianshaohua 的回复:]
依赖注入:就是你公布一个接口,然后外部实现你的接口,并把类的实例通过接口让你的程序调用,基本就是这个意思了;
[/Quote]

感觉也是这个意思
ztenv 2010-06-25
  • 打赏
  • 举报
回复
依赖注入:就是你公布一个接口,然后外部实现你的接口,并把类的实例通过接口让你的程序调用,基本就是这个意思了;
倒霉熊 2010-06-25
  • 打赏
  • 举报
回复

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧