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

你可能感兴趣的文章
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>
MySql中的concat()相关函数
查看>>
mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
查看>>
MySQL中的count函数
查看>>
MySQL中的DB、DBMS、SQL
查看>>
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>
MySQL中的IO问题分析与优化
查看>>
MySQL中的ON DUPLICATE KEY UPDATE详解与应用
查看>>
mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
查看>>
mysql中的undo log、redo log 、binlog大致概要
查看>>
Mysql中的using
查看>>
MySQL中的关键字深入比较:UNION vs UNION ALL
查看>>
mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
查看>>