博客
关于我
简单理解IOC控制反转和DI依赖注入
阅读量:408 次
发布时间:2019-03-06

本文共 1138 字,大约阅读时间需要 3 分钟。

用过.net core框架的同学都知道,框架默认支持“构造函数”注入引用对象的方式。使用.net core框架也有一段时间了,最近去了解了一下到底什么是“依赖注入”,而往往谈到依赖注入,必然绕不开“控制反转”。

网上对它们也是众说纷纭,今天基于自己的理解,和大家简单交流下。

“控制反转”(Inversion of Control)IOC

先提出两个问题:

1.有反转肯定有正转吧?

2.哪些方面的控制被反转了?

好了,带着上面的问题,我们一边说一边思考,进入如下场景。

有两个类class A和class B分别实现不同的逻辑,classA需要引用classB,调用B中的某个方法。

“控制正转”:也就是我们实现对象引用的常用模式,classA要想获取对classB对象的引用,需要在classA类中直接new 一个classB的对象,以持有对classB的对象。

//添加classB对象的引用ClassB objB=new ClassB();//调用B的方法objB.Get();

直接new了一个对象,同时也建立了classA和classB之间的耦合关系,在如今越来越强调“低耦合”的业务场景下,显然是有点影响系统可扩展性。于是,出现了“控制反转”。

“控制反转”:相比于“控制正转”获取对象引用直接new的实现方式,控制反转将获取对象引用的实现交给了容器统一管理。类似于设计模式中的“工厂模式”,由容器统一实例化引用对象。

实际上也就是“获取引用对象的方式发生了转换”,由之前的调用者classA直接new一个classB对象引用,变成后来的由外部系统注入引用对象。如:classA通过构造函数接收classB的引用对象,外部调用时传入B对象,classA只是被动的等待classB引用对象,不再主动创建。

//创建classB私有对象private readonly ClassB _objB;//构造函数注入classB引用对象public ClassA(ClassB objB){   _objB=objB;}//调用classB方法public string GetA(){   _objB.Get();}

“依赖注入”(DependencyInjection)DI

在程序运行过程中,动态的向某个对象提供它所需要的其他引用对象。简单理解:依赖=引用对象,注入=添加方式,也就是指添加引用对象的方式。通常由容器统一管理引用对象的实例化。

实现方式,主要包括:属性注入和构造函数注入。

 

大家可以看到,在谈到控制反转的时候,也已经提到了“依赖注入”,实际上我们可以把“依赖注入”看成是“控制反转”的一种实现方式,两者实际上是同一个事情,只是从不同角度的描述而已

转载地址:http://khlkz.baihongyu.com/

你可能感兴趣的文章
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Vue过渡 & 动画---vue工作笔记0014
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty 的 Handler 链调用机制
查看>>
Netty 编解码器和 Handler 调用机制
查看>>
Netty 编解码器详解
查看>>
Netty 解决TCP粘包/半包使用
查看>>
Netty 调用,效率这么低还用啥?
查看>>
Netty 高性能架构设计
查看>>
Netty+Protostuff实现单机压测秒级接收35万个对象实践经验分享
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
netty--helloword程序
查看>>
netty2---服务端和客户端
查看>>
Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
查看>>
netty——bytebuf的创建、内存分配与池化、组成、扩容规则、写入读取、内存回收、零拷贝
查看>>
netty——Channl的常用方法、ChannelFuture、CloseFuture
查看>>
netty——EventLoop概念、处理普通任务定时任务、处理io事件、EventLoopGroup
查看>>
netty——Future和Promise的使用 线程间的通信
查看>>
netty——Handler和pipeline
查看>>