依赖注入和控制反转

概念

 IoC——Inversion of Control  控制反转
 DI——Dependency Injection   依赖注入

要想理解上面两个概念,就必须搞清楚如下的问题:

  • 参与者都有谁?

  • 依赖:谁依赖于谁?为什么需要依赖?

  • 注入:谁注入于谁?到底注入什么?

  • 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)?

  • 依赖注入和控制反转是同一概念吗?

下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了。

  1. 参与者都有谁:一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

  2. 谁依赖于谁:当然是某个对象依赖于IoC/DI的容器

  3. 为什么需要依赖:对象需要IoC/DI的容器来提供对象需要的外部资源

  4. 谁注入于谁:很明显是IoC/DI的容器 注入 某个对象

  5. 到底注入什么:就是注入某个对象所需要的外部资源

  6. 谁控制谁:当然是IoC/DI的容器来控制对象了

  7. 控制什么:主要是控制对象实例的创建

  8. 为何叫反转:反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。

 

用图例来说明一下,先看没有IoC/DI的时候,常规的A类使用C类的示意图,如图所示:

 

 

当有了IoC/DI的容器后,A类不再主动去创建C了,如图所示:

           A类不再主动创建C

 

而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中,

            有IoC/DI容器后程序结构示意图

 

依赖注入和控制反转是同一概念吗?

    根据上面的讲述,应该能看出来,依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

总结

实IoC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入它所需要的资源了。
        这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

原文地址:http://www.cnblogs.com/liying0721/p/6824742.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop生态Flume(一)介绍

一、概述 Apache Flume是一个分布式,可靠且可用的系统,用于有效地收集,聚合大量日志数据并将其从许多不同的源移动到集中式数据存储中。 Apache Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量…

centos7安装最新版node

为了在linux服务端运行前端以及node后端项目,就必须在服务器上安装node了 但是想要运行前端项目版本就必须是8.x以上的,所以我们干脆安装最新的node 下载 进入下面的官方网站 https://nodejs.org/en/download/ 点击64位的Linux下载 复制该网址 这里以…

[译]ASP.NET Core 2.0 网址重定向

问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter): public void Configure(IApplicationBuilder app, …

纪中2019(上)游记+总结

目录之下 文章目录目录之下游记之下Day−1Day-1Day−1Day0Day0Day0Day1Day1Day1Day2Day2Day2Day3Day3Day3Day4Day4Day4Day5Day5Day5Day6Day6Day6Day7Day7Day7Day8Day8Day8Day9Day9Day9Day10Day10Day10Day11Day11Day11Day12Day12Day12Day13Day13Day13Day14Day14Day14比赛之下欢乐…

asp.net core WebAPI实现CRUD

本节用于构建一个简单的WebAPI来管理to-do列表。不会创建用户界面。 API Description Request body Response body GET /api/todo Get all to-do items NoneArray of to-do items GET /api/todo/{id} Get an item by ID NoneTo-do item POST /api/todo Add a new item To-do it…

Hadoop2.6.0的Intellij Idea 插件

一、Hadoop2.6.0的Idea Intellij插件下载 github源码地址 github插件压缩包 二、安装插件 setting》Plugins》install plugins from disk 选择压缩包,重启Idea就行 安装完的结果:

v-for指令案例详解

对于v-for指令,以前老是不能理解,经常记混,所以特地写篇笔记来加强下记忆,希望借此能学的更深刻一点 v-for顾名思义就是个for循环,是vue的一个循环。在遍历json字符串的时候有奇佳的效果,感觉就是为他们而造…

Docker ASP.NET Core 2.0 微服务跨平台实践

本篇博文的目的:在 Mac OS 中使用 VS Code 开发 ASP.NET Core 2.0 应用程序,然后在 Ubuntu 服务器配置 Docker 环境,并使用 Docker 运行 Consul 和 Fabio 环境,最后使用 Docker 运行 ASP.NET Core 2.0 应用程序。 你要的项目源码&…

微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure、数据、AI 开发工具的内容。这是第一天的 Connect(); 2017 的主题演讲。 在开场视频中霍金又来了。你记得这个Intel为他开发的系统使用了C#,而且是开源的,在Github上地址&#x…

Hadoop生态hive(五)Hive QL数据库

(1)查看数据库 show databases; (2)使用数据库 use db; (3)查看当前数据库 #与mysql的select database();不一样 select current_database(); (4)创建数据库 create database [if …

讨论.NET Core 配置对GC 工作模式与内存的影响

引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 Asp.net core应用在 Kubernetes上内存使用率过高问题分析 这篇文章中讨论了,在默认情况下,ASP.NET Core程序跑在K8s的Docker中内存使用率>600MB,导致Docker容器频繁重启…

Hadoop生态hive(六)Hive QL表

一、创建表 语法: create [temporary] [external] table [if not exists] [db_name.] table_name [(col_name data_type [comment col_comment], ...)] [comment table_comment] [row format row_format] [stored as file_format] 例子: create tab…

v-for渲染img标签图片

错误的示例 <div v-for"item in list"><img src"{{item.image}}" /> </div>这样做会报错 正确的做法应该是 <div v-for"item in list"><img :src"item.image" /> </div>这样就可以把后端接口的…

Mono的新解释器

Mono即将通过它的JIT编译器和静态编译器以及一个.net解释器以带来一些新的方式来运行你的代码. 在2001年Mono项目诞生之时&#xff0c;我们为.net指令集实现了一个解释器用基于它实现了一个在Linux上的自托管的.net开发环境. 当时我们把解释器定义为一个用来构建JIT编译器的临时…

欢乐纪中某B组赛【2019.1.27】

前言 写完T1T1T1和T2T2T2颓了半天 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2222017myself2017myself2017myself2302302301001001001001001003030304442017xxy2017xxy2017xxy2002002001001001001001001000001111112017zyc2017zy…

Apache Druid(一)简介

翻译自 Apache Druid Apache Druid&#xff08;正在孵化&#xff09;是一个开源的分布式数据存储。德鲁伊的核心设计结合了OLAP /分析数据库&#xff0c;时间序列数据库和搜索系统的思想&#xff0c;为广泛的用例创建了一个统一的系统。Druid将这三个系统中的每个系统的关键特…

[ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了

发现问题 在将 FineUIMvc&#xff08;支持ASP.NET MVC 5.2.3&#xff09;升级到 ASP.NET Core 2.0 的过程中&#xff0c;我们发现一个奇怪的现象&#xff1a; 通过项目引用 FineUICore 工程一切正常&#xff0c;但是将 FineUICore 编译后&#xff0c;通过程序集的引用方式就会报…

设计事件驱动的微服务

事件驱动的微服务是一个未受到应有探讨的领域&#xff0c;在近日举行的Con伦敦2017微服务大会上&#xff0c;Greg Young表达了这样的观点。同时&#xff0c;他还特别强调&#xff0c;不应该对所有的微服务都使用事件驱动模式。相反&#xff0c;他建议逐个服务进行考察&#xff…

express中获取url参数

问号传参获取参数 获取 http://127.0.0.1:3001/user?id10&namezs 中的查询参数&#xff1a; 直接使用 req.query 获取参数即可&#xff1b; 注意&#xff1a;URL 地址栏中通过 查询字符串 传递的参数&#xff0c;express 框架会直接解析&#xff0c;大家只需使用 req.que…

处理ASP.NET Core中的HTML5客户端路由回退

在使用由Angular&#xff0c;React&#xff0c;Vue等应用程序框架构建的客户端应用程序时&#xff0c;您总是会处理HTML5客户端路由&#xff0c;它将完全在浏览器中处理到页面和组件的客户端路由。几乎完全在浏览器中... HTML5客户端路由在客户端上工作的很好&#xff0c;但是当…