DI是什么?

Dependency Injection 常常简称为:DI。

它是实现控制反转(Inversion of Control – IoC)的一个模式。

fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。

“几十年”以来,相信大家都早已学会了 大大大神 的教典。

我们简单回忆一下对应内容,以便我们可以顺利进入后续章节:徒手撸个小DI。

文章内容大致是这样:

首先举例:

然后大大大神吐槽了一堆:

这个实现类的名字就说明:我将要从一个逗号分隔的文本文件中获得影片列表。你不必操心具体的实现细节,只要设想这样一个实现类就可以了。如果这个类只由我自己使用,一切都没问题。但是,如果我的朋友叹服于这个精彩的功能,也想使用我的程序,那又会怎么样呢?如果他们也把影片清单保存在一个逗号分隔的文本文件中,并且也把这个文件命名为” movie1.txt “,那么一切还是没问题。如果他们只是给这个文件改改名,我也可以从一个配置文件获得文件名,这也很容易。但是,如果他们用完全不同的方式——例如SQL 数据库、XML 文件、web service,或者另一种格式的文本文件——来存储影片清单呢?在这种情况下,我们需要用另一个类来获取数据。由于已经定义了MovieFinder接口,我可以不用修改moviesDirectedBy方法。但是,我仍然需要通过某种途径获得合适的MovieFinder实现类的实例。

还有张依赖图

MovieLister类既依赖于MovieFinder接口,也依赖于具体的实现类。我们当然希望MovieLister类只依赖于接口,但我们要如何获得一个MovieFinder子类的实例呢?

在Patterns of Enterprise Application Architecture一书中,我们把这种情况称为插件(plugin):MovieFinder的实现类不是在编译期连入程序之中的,因为我并不知道我的朋友会使用哪个实现类。我们希望MovieLister类能够与MovieFinder的任何实现类配合工作,并且允许在运行期插入具体的实现类,插入动作完全脱离我(原作者)的控制。这里的问题就是:如何设计这个连接过程,使MovieLister类在不知道实现类细节的前提下与其实例协同工作。

将这个例子推而广之,在一个真实的系统中,我们可能有数十个服务和组件。在任何时候,我们总可以对使用组件的情形加以抽象,通过接口与具体的组件交流(如果组件并没有设计一个接口,也可以通过适配器与之交流)。但是,如果我们希望以不同的方式部署这个系统,就需要用插件机制来处理服务之间的交互过程,这样我们才可能在不同的部署方案中使用不同的实现。所以,现在的核心问题就是:如何将这些插件组合成一个应用程序?这正是新生的轻量级容器所面临的主要问题,而它们解决这个问题的手段无一例外地是控制反转(Inversion of Control)模式。

学术一点就是说 避免类之间强耦合,我们需要用依赖注入等方式在运行时才建立依赖达到代码松耦合,从而使代码易为维护

戏言就是在说:

  1. 我们都是大忙人,请你作为一个类简单明了的说清楚 : 你这个类能干什么事? 不要让我们这些大忙人把你每件衣服一件一件看完了才知道你是木匠, 还是铁匠

  2. 我们都是大老板,我们财产不能全靠你一个,你不能干活或者你干不好活,我们做老板的人必须能找人换了你

所以上述代码中:

我(MovieLister)离不开了 你 (ColonDelimitedMovieFinder("movies1.txt")),

但是我们男人必须靠自己,至少表面没人看出我们之间的关系

只有从我们(MovieLister)身体里面没有了你,才能没人看出我们之间的关系

当我们开始干活的时候,我们再根据我们的私下关系协调好工作,男女搭配,好好干活。

说到这里, 各位要被面试的同学记好这些话, 不要被问到依赖注入帮我解决了什么事情的时候, 回一句 我们不用自己new 对象啦, 这样大家就不会看见面试官无语又懵逼的脸了。

依赖注入的几种形式

这几种方式之间并没有性能或者什么特别的优势,主要是形式上的差异。

具体对比可以参考 http://insights.thoughtworkers.org/injection/

引用参考:

  • http://insights.thoughtworkers.org/injection/

  • https://www.martinfowler.com/articles/injection.html

原文地址: https://www.cnblogs.com/fs7744/p/9919559.html


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

手把手教你写DI_0_DI是什么?相关推荐

  1. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  2. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  3. php注册程序,[PHP初级]手把手教你写注册程序 1

    [PHP初级]手把手教你写注册程序 1 实例内容 在此教程,我们将通过写一个用户注册程序,学习以下内容: 数据的传输与获取 信息的验证 pdo方式操作数据库 事务处理 前台显示文件:index.php ...

  4. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  5. 手把手教你写Linux I2C设备驱动

    手把手教你写Linux I2C设备驱动 标签:Linux 设备 驱动 详解 i2c 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http:/ ...

  6. 手把手教你写DI_2_小白徒手撸构造函数注入

    在上一节:手把手教你写DI_1_DI框架有什么? 我们已经知道我们要撸哪些东西了 那么我们开始动工吧,这里呢,我们找小白同学来表演下 小白同学 :我们先定义一下我们的广告招聘纸有什么: 好,我们实现两 ...

  7. 手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期

    在上一节:手把手教你写DI_2_小白徒手撸构造函数注入 浑身绷带的小白同学:我们继续开展我们的工作,大家都知道 Singleton是什么,就是全局只有一个呗,我们就先从它开始,这个多简单,我们找个字典 ...

  8. 手把手教你写一个spring IOC容器

    本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功 ...

  9. 手把手教你写网站:Python WEB开发技术实战

    摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...

最新文章

  1. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
  2. 如何将.py文件转换为.exe
  3. 0220互联网新闻 | 豆瓣FM获腾讯音乐娱乐集团投资;华为云将在新加坡拓展云平台和人工智能能力...
  4. 6410 linux内核移植
  5. [SoapUI] 在Test Step 下加Script Assertion,用 messageExchange 获取当前步骤的response content...
  6. P6282 [USACO20OPEN] Cereal S 思维
  7. VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程
  8. 【mac】Mac 安装 RabbitMQ
  9. 11.11.17 start L3
  10. es6学习 http://es6.ruanyifeng.com/
  11. 吴恩达获英特尔投资!这次,英特尔拿出7.85亿砸向AI创业公司
  12. c语言中的errno
  13. 深度学习推荐模型-DeepFM
  14. hardmard积 用什么符号表示_[关于数学哲学的科普]为数学学习准备的基础数理逻辑(用自然推理系统展现的命题演算以及一阶谓词演算)...
  15. linux内核路由反向检查,Linux内核的反向路由检查机制
  16. Flex在线拍照功能
  17. linux下远程桌面连接工具,linux远程连接windows工具(tsclient 远程桌面)
  18. 2023河南大学计算机考研信息汇总
  19. 让旧Mac免费获得 iWork 套件的秘籍
  20. 高维内积的数学符号括弧

热门文章

  1. java读取excel某个单元格的值_java poi怎么获取excel单元格的内容
  2. zookeeper的单实例和伪集群部署
  3. Mysql 的子查询
  4. 云堆栈三大服务模式解析
  5. brew mysql 添加修改mysql配置
  6. 第五周项目2-对象作为数据成员
  7. 时隔两年 重新当码农
  8. Appointment over SMS on Windows Mobile
  9. .NET 6新特性试用 | 常量内插字符串
  10. 集成开放平台标准化连接器之基于OAS3.0的API管理能力