本篇文章来自对 Nikola Malovic 博客文章 《Inversion Of Control, Single Responsibility Principle and Nikola’s laws of dependency injection》的翻译和改编。

关于控制反转(Inversion Of Control)的使用在社区中有很多讨论,如何更好的实现单一职责原则 (Single Responsibility Principle) ,更合理的利用依赖注入 (Depencency Injection) 一直是讨论的重点,本篇文章将介绍 Nikola Malovic 提出的关于使用 IoC 的 5 项法则。

依赖注入所遇到的问题:

  1. 如何避免将那些我们并不感兴趣的通用依赖项注入到每个类中?
  2. 如何处理那些有可能会用到,但是实例化过程特别昂贵的依赖项?
  3. 如何为我们的类构造对象图谱,而且要考虑到每个依赖项均有其自身的依赖项?

Nikola 的 5 项依赖注入法则

采用 DDD 设计原则,可以保持设计的整洁,代码可维护性更高。通常,实体类不应该依赖诸如基础设施服务类等。

Nikola 依赖注入法则 1 :仅在 IoC 容器中存储服务类,不要存储实体类(Entities)。

如果所设计的类在构造函数中注入了过多的依赖项,则可以考虑是否违背了 SRP (Single Responsibility Principle) 原则 和 SOC (Separation of Concerns) 原则。而通常这种类将可以被分解为多个内聚的类,而每个分解出的类将包含更少的依赖项。

Nikola 依赖注入法则 2 :任何包含超过 3 个依赖项的类都应该被怀疑违背了单一职责原则(SRP)。

通常,并不建议使用属性注入来代替构造函数注入,尽管属性注入可以移除哪些构造函数杂音。但事实上,真实直接的经验表明,属性注入是比构造函数注入更差的选择。这是因为采用属性注入方式,导致依赖项注入的不透明性。

Nikola 依赖注入法则 3 :类的每个依赖项均需要在类的构造函数中显示的注入。

对于从 IoC 容器构造的类实例来说,我们应该尽可能的保持构造函数的轻量,并仅定义类自身的依赖项。任何类的初始化或者部分实现都不应该由构造函数触发。取而代之的是在 IoC 容器构造类实例完毕后,显示的调用指定的类成员函数来实现。

Nikola 依赖注入法则 4 :类的每个构造函数中除了接受其依赖项集合的注入,不能包含任何其他实现。

通常,建议将所有 IoC 容器的注册映射过程集中在一个 Bootstrapper 中来处理,Bootstrapper 可以使用 Builder 模式进行构造。Bootstrapper 可以在应用程序的启动阶段进行初始化,构造所有依赖项的映射。而其他代码不应该意识到 IoC 容器的存在。

Nikola 依赖注入法则 5 :IoC 容器应该被显示的应用在 Bootstrapper 中。任何启用 IoC 的代码(包括单元测试代码)都应该完全不知道 IoC 容器的存在。

参考资料

Nikola的5项依赖注入法则的更多相关文章

  1. 重新整理 .net core 实践篇————依赖注入应用之生命法则[三]

    前言 该章演示依赖注入中,对象的释放行为. 紧接上文表示,演示: services.AddSingleton<IMySingletonService, MySingletonService> ...

  2. 基于DDD的.NET开发框架 - ABP依赖注入

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  3. 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)

    依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...

  4. Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  5. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  6. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...

  8. springioc之依赖注入

    1.1.2  IoC能做什么 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类 ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式

    原文:[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式 IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照“好莱坞法则”实现应用 ...

随机推荐

  1. ITop

    iTop,即IT运营门户(IT Operation Portal),是一个开源web应用程序,用于IT环境的日常运营.它基于ITIL最佳实践,而又不拘泥于任何具体流程.它很灵活,可以适应不管是非正 式 ...

  2. archlinux更新错误

    问题1 初始化下载: http://repo.archlinuxcn.org/x86_64/wps-office-10.1.0.5672_a21-2-x86_64.pkg.tar.xz 文件大小: 1 ...

  3. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  4. 循序渐进之Spring AOP(5) - 创建切面

    在掌握了可用的增强后,接下来要做的就是精确的描述切点.前面的示例都是指定一个目标类并把增强织入到所有方法中,实际开发显然会有更精细的筛选需求,比如对所有类中名称以test结尾的方法加入监控执行时间,或 ...

  5. pcm跟.wav文件的关系

    PCM(Pulse Code Modulation----脉码调制录音).所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录.PCM信号是由[1].[0]等符号构成的数字信号,而未经过任 ...

  6. C++中的预处理

    一.预处理的由来:      在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个.C++从C语言那里把C语言预处理器继承过来(C语言预处理器,被Bjarn ...

  7. mysql.sock的作用

    1.在编译安装mysql的时候,会将mysql的配置文件复制到/etc/my.conf中: [root@Web-lnmp02 mysql]# cp support-files/my-small.cnf ...

  8. crontab这个坑,执行单个命令执行成功,但是写到crontab怎么也不行

    昨天开始,一直在弄通过定时任务控制熄屏,在终端下的单个命令可以执行成功,写到脚本里,单个执行脚本能成功,但是写到crontab定时任务,怎么也不熄屏,但他确实执行了,看日志,是一直报错的:百度了很多很 ...

  9. POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)

    题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...

  10. Light OJ 1019 - Brush (V)(图论-dijkstra)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...