博客
关于我
简单理解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/

你可能感兴趣的文章
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>