简单理解IOC控制反转和DI依赖注入
用过.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
在程序运行过程中,动态的向某个对象提供它所需要的其他引用对象。简单理解:依赖=引用对象,注入=添加方式,也就是指添加引用对象的方式。通常由容器统一管理引用对象的实例化。
实现方式,主要包括:属性注入和构造函数注入。
大家可以看到,在谈到控制反转的时候,也已经提到了“依赖注入”,实际上我们可以把“依赖注入”看成是“控制反转”的一种实现方式,两者实际上是同一个事情,只是从不同角度的描述而已。
简单理解IOC控制反转和DI依赖注入的更多相关文章
- 【转】跟我一起学Spring 3(4)–深入理解IoC(控制反转)和DI(依赖注入)
在继续下面的章节之前,我们要先说说大名鼎鼎的IoC和DI. 我们经常会听说IoC,也就是Inversion of Controller,控制反转.事实上,IoC并不是一个新鲜的概念,最早可能是在198 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- 谈谈php里的IOC控制反转,DI依赖注入(转)
转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和" ...
- [转帖]什么是IOC(控制反转)、DI(依赖注入)
什么是IOC(控制反转).DI(依赖注入) 2018-08-22 21:29:13 Ming339456 阅读数 20642 原文地址(摘要了部分内容):https://blog.csdn.net ...
- IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...
- Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)
Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么? IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...
- Spring-初识Spring框架-IOC控制反转(DI依赖注入)
---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- .net 温故知新:【7】IOC控制反转,DI依赖注入
IOC控制反转 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图. 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时, ...
随机推荐
- dotnet6 C# 一个国内还能用的 NTP 时间校准客户端的实现
本文来记录一个我自己在使用的 NTP 时间校准客户端的实现 核心方法是在国内使用 腾讯 和 阿里 提供的 NTP 时间服务器来获取网络时间,如果连接不上,再依次换成 国家服务器 和 中国授时 服务,如 ...
- S3-FIFO
S3-FIFO 本文作为下一篇缓存文章的预备知识. 背景 基于LRU和FIFO的驱逐 FIFO和LRU都是经典的缓存驱逐算法,在过去几十年中也出现了很多追求更高效率的驱逐算法,如ARC, 2Q, LI ...
- 使用 Docker 自建一款怀旧游戏之 - 扫雷
1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中.游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷.每个方 ...
- 一键自动化博客发布工具,chrome和firfox详细配置
blog-auto-publishing-tools博客自动发布工具现在已经可以同时支持chrome和firefox了. 很多小伙伴可能对于如何进行配置和启动不是很了解,今天带给大家一个详细的保姆教程 ...
- 【git】建立分支
1.git clone现有的项目 git clone git@github.com:zhangshengdong/Zflask.git 2.建立关联 git remote add origin git ...
- 如何实现一个简单易用的 RocketMQ SDK
2018 年,做为架构负责人,接到一个架构需求:实现一个简单易用的 RocketMQ SDK . 因为各个团队 RocketMQ 原生客户端配置起来千奇百怪,有的配置存在风险,各团队负责人都需要一个简 ...
- go 操作 Excel
文档地址: https://xuri.me/excelize/zh-hans/ package main import ( "fmt" "github.com/xuri/ ...
- 什么是NASM
什么是NASM NASM是一个汇编器的名称,全称是Netwide Assembler,支持x86与x64架构的CPU(注意不支持ARM架构). 我们知道,在x86和x64架构上有多个操作系统,比较流行 ...
- postgresql性能优化1:min和max的性能
select max(datatime) as id from mytable ---全表检索,时间慢执行时间5分钟 select max(datatime) as id from mytable w ...
- VNC 远程桌面很卡,替代方案如下
VNC 远程桌面是一款古老的远程桌面软件,是基于 Unix 和 Linux 操作系统的免费的开源软件.免费开源很好,但是 VNC 也存在一些缺点. 1.VNC 远程桌面很卡 想白嫖 VNC,就要接受卡 ...