依赖注入???

mirrorspace 2020-03-07 04:54:20
又看了一下依赖注入....
所谓依赖注入是
class A
{
void Run()
{
var b=new B();
b.Get();
}
}
class B
{
void Get(){}
}
类A,的Run方法要用到类B,所以,类A"依赖"类B

根据OOP,这种TMD依赖加深了类之间的耦合...,如果类A的RUN方法变成类B1了,就要改类A,
class A
{
void Run()
{
var b1=new B1();
b1.Get();
}
}
所以,,要改进....!

弄一个接口IB,让所有类B继承,类A就可以接受不同的类B了,类A改成这样

class A
{
IB _b
// 构造函数接受b
A(IB b)
{
this_b=b;
}
void Run()
{
b.Get();
}
}

说是可以不用在类A中,new B(),这样类A不再依赖类B了....

但是,问题是,在使用时,不还是要写new B()这样的代码吗,只是没在类A中写吧了
IB b=new B();
A a=new A(b);
a.Run();

这就是所谓的依赖注入......
这到底有什么好处呢,,,
感觉有点脱裤子放屁
...全文
539 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 mirror030 的回复:
[quote=引用 1 楼 楠小南 的回复:] 你只了解一部分,他还有其他的东西,比如 IOC 控制反转, 他有一种方式叫“依赖查找”。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中,你要什么并不是自己去NEW,而是由ioc 去调控的
那么,这个IOC才是依赖注入的关键,能够管理所有对象的调用关系. 究竟为什么要这样做呢?[/quote]方便解耦,维护呀,你只需要在ioc里面管理 ,对比以前,假如代码中有很多地方要B 你是通过注入来实现 ,发生变化 你改ioc就好了
DerekTTE 2020-03-11
  • 打赏
  • 举报
回复
这里的都是高手啊啊啊
mirrorspace 2020-03-11
  • 打赏
  • 举报
回复
小项目就是一把说,劝说哈
引用 14 楼 正怒月神 的回复:
[quote=引用 13 楼 头戴三冠 的回复:] [quote=引用 12 楼 正怒月神 的回复:]
小型项目 一把梭就行[/quote] 恩,直接实现逻辑就是了。[/quote]
mirrorspace 2020-03-11
  • 打赏
  • 举报
回复
嗯看了ABP框架是死活不待见,主要是不会用框架,感觉麻烦及了.虽然自己也觉得框架省时高效,但前提是要深度理解框架,否则只是会用,远远不行
引用 16 楼 勾吴江南 的回复:
依赖注入是为了更好的解耦合。至于楼主提到的New的问题我也无语了。至少我用过的框架中不会主动让你去new的。一切都会由框架代劳。我建议楼主去深入学习一下Asp.net Core的框架或者去看一下Abp框架。那些都是经典的依赖注入的解决方案
勾吴江南 2020-03-11
  • 打赏
  • 举报
回复
依赖注入是为了更好的解耦合。至于楼主提到的New的问题我也无语了。至少我用过的框架中不会主动让你去new的。一切都会由框架代劳。我建议楼主去深入学习一下Asp.net Core的框架或者去看一下Abp框架。那些都是经典的依赖注入的解决方案
正怒月神 2020-03-10
  • 打赏
  • 举报
回复
引用 13 楼 头戴三冠 的回复:
[quote=引用 12 楼 正怒月神 的回复:]
小型项目 一把梭就行[/quote] 恩,直接实现逻辑就是了。
极客诗人 2020-03-10
  • 打赏
  • 举报
回复
引用 12 楼 正怒月神 的回复:
小型项目 一把梭就行
正怒月神 2020-03-10
  • 打赏
  • 举报
回复
引用 11 楼 mirror030 的回复:
看了你的帖子又加深了一些理解... 现在我是认为这个依赖注入的玩法大体如下: 由依赖注入框架管理,有一个配置文件记录了所有的类,并且给这些类设置了不同的属性,这是关键,在程序中,框架是如何new 出实现某个接口的那个具体的类,就靠这些属性. 在这个配置文件的管理下,类就像一个插件,在给系统加功能时,加一个实现接口的类就可以了,然后再配置文件中记录这个类,调用的逻辑不用修改,系统就有了这功能. 配置文件影响了框架调用代码的逻辑,由于面向接口编程,依赖关系转到接口上,不在实现接口的具体类上,所以也就没有依赖具体类的问题. 感觉....不怎么有意思 [quote=引用 7 楼 正怒月神 的回复:] 而且,有些框架,比如spring框架。 会给你解决 原来深度循环的问题。 也就是 A引用了B,B引用了A。 其实这个手动也能解决,无非就是大家都通过接口NEW就可以了。
引用 10 楼 头戴三冠 的回复:
https://www.jianshu.com/p/5089755da206
[/quote] 恩,就是这个意思。 所以对中小型项目来说,并不是必须的。
mirrorspace 2020-03-10
  • 打赏
  • 举报
回复
看了你的帖子又加深了一些理解... 现在我是认为这个依赖注入的玩法大体如下: 由依赖注入框架管理,有一个配置文件记录了所有的类,并且给这些类设置了不同的属性,这是关键,在程序中,框架是如何new 出实现某个接口的那个具体的类,就靠这些属性. 在这个配置文件的管理下,类就像一个插件,在给系统加功能时,加一个实现接口的类就可以了,然后再配置文件中记录这个类,调用的逻辑不用修改,系统就有了这功能. 配置文件影响了框架调用代码的逻辑,由于面向接口编程,依赖关系转到接口上,不在实现接口的具体类上,所以也就没有依赖具体类的问题. 感觉....不怎么有意思
引用 7 楼 正怒月神 的回复:
而且,有些框架,比如spring框架。 会给你解决 原来深度循环的问题。 也就是 A引用了B,B引用了A。 其实这个手动也能解决,无非就是大家都通过接口NEW就可以了。
引用 10 楼 头戴三冠 的回复:
https://www.jianshu.com/p/5089755da206
正怒月神 2020-03-09
  • 打赏
  • 举报
回复
而且,有些框架,比如spring框架。 会给你解决 原来深度循环的问题。 也就是 A引用了B,B引用了A。 其实这个手动也能解决,无非就是大家都通过接口NEW就可以了。
正怒月神 2020-03-09
  • 打赏
  • 举报
回复
我觉得你对依赖注入的理解有些问题。
我个人感觉,依赖注入和几个类之间的耦合并没有太多关系。

我说说自己的理解。
1 控制反转(ioc)和依赖注入(di)。
我个人认为,控制反转是概念。依赖注入是它的实现。
其实这个没什么好特别纠结的。

2 依赖注入的常用三种做法
属性注入,构造器注入,注解注入。
这三个,是依赖注入的具体实现方案。

3 谁来帮你完成。
其实有一个容器,来帮你完成注入过程。
通过上面3种注入方式,
你会从以前的 IMilk m=new AMilk,变成:IMilk m;
然后,容器会帮你管理和生成a的实例。

4 好处
说实话吧,我感觉好处呢,是有的。
但是要看项目。
一般来说,中小型项目,其实并没有特别明显的好处。
我们假设你现在有一个 接口 IMilk,实现类 AMilk。
这是提供给A牛奶厂的底层实现。
现在要给B牛奶厂的底层也实现了。那么你会实现BMilk。

如果不适用ioc的概念,那么你要去底层,或者每个service等等的地方,修改 IMilk m=new BMilk();
但是使用后,你只需要(甚至不用)修改一个配置文件,就可以了。因为你的代码中,都是 IMilk m;



ITFU 2020-03-09
  • 打赏
  • 举报
回复
依赖注入你用过一个例子大概就有体会了,结合框架使用,一般会配合注解(C#里可能是特性文字)使用,对象不用自己创建,最直观的就是会少写很多代码。
极客诗人 2020-03-09
  • 打赏
  • 举报
回复
https://www.jianshu.com/p/5089755da206
极客诗人 2020-03-09
  • 打赏
  • 举报
回复
忘记之前看的一个段子 我搬一下 那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。
极客诗人 2020-03-09
  • 打赏
  • 举报
回复
就是以前你疯狂new new new 现在丢个框架注册好了 要用的时直接用
mirrorspace 2020-03-07
  • 打赏
  • 举报
回复
了解了一些. 那么IOC的设计才是关键点. 而这些用法只是表面现象,实现这个设计使用的技术应该是面向接口编程, 框架以一个固定的模式在调用各种类,那么 IOC是怎么实现new 出具体类的呢
楠小南 2020-03-07
  • 打赏
  • 举报
回复



引用 2 楼 mirror030 的回复:
[quote=引用 1 楼 楠小南 的回复:]
你只了解一部分,他还有其他的东西,比如 IOC 控制反转,
他有一种方式叫“依赖查找”。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中,你要什么并不是自己去NEW,而是由ioc 去调控的

那么,这个IOC才是依赖注入的关键,能够管理所有对象的调用关系.
究竟为什么要这样做呢?[/quote]

方便调试和维护啦,还有模块可以重用和解耦等等,反正就是这样
mirrorspace 2020-03-07
  • 打赏
  • 举报
回复
引用 1 楼 楠小南 的回复:
你只了解一部分,他还有其他的东西,比如 IOC 控制反转, 他有一种方式叫“依赖查找”。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中,你要什么并不是自己去NEW,而是由ioc 去调控的
那么,这个IOC才是依赖注入的关键,能够管理所有对象的调用关系. 究竟为什么要这样做呢?
楠小南 2020-03-07
  • 打赏
  • 举报
回复
你只了解一部分,他还有其他的东西,比如 IOC 控制反转,
他有一种方式叫“依赖查找”。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中,你要什么并不是自己去NEW,而是由ioc 去调控的

110,538

社区成员

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

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

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