Nikola的5项依赖注入法则
本篇文章来自对 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 项法则。
依赖注入所遇到的问题:
- 如何避免将那些我们并不感兴趣的通用依赖项注入到每个类中?
- 如何处理那些有可能会用到,但是实例化过程特别昂贵的依赖项?
- 如何为我们的类构造对象图谱,而且要考虑到每个依赖项均有其自身的依赖项?
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 容器的存在。
参考资料
- Design for testability – Transparent and opaque dependencies
- Dependency injection and service locator
- The Art of Unit Testing
- Jeremy’s Second Law of TDD: Push, Don’t Pull
- Why TypeMock for TDD?
Nikola的5项依赖注入法则的更多相关文章
- 重新整理 .net core 实践篇————依赖注入应用之生命法则[三]
前言 该章演示依赖注入中,对象的释放行为. 紧接上文表示,演示: services.AddSingleton<IMySingletonService, MySingletonService> ...
- 基于DDD的.NET开发框架 - ABP依赖注入
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)
依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...
- Java Web实现IOC控制反转之依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...
- springioc之依赖注入
1.1.2 IoC能做什么 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式
原文:[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式 IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照“好莱坞法则”实现应用 ...
随机推荐
- vim总结
1.vim基础用法 注:该思维导图来自笔者<Linux就该这么学>读书笔记. 移动光标: 命令 描述 k 向上移动光标(移动一行) j 向下移动光标(移动一行) h 向左移动光标(移动一个 ...
- Ninject的使用
摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...
- 第一零五天上课 PHP TP框架下分页
控制器代码(TestController.class.php) <?php namespace Home\Controller; use Home\Controller\EmptyControl ...
- 项目支持Servlet3.0的新特性
一.Servlet3.0介绍 Servlet3.0是Java EE6规范的一部分,Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述 ...
- 在linux上使用交换文件扩展交换空间
想像一种情景,当我们的Linux系统用尽交换空间时,在这种情况下,我们想要使用swap分区扩展交换空间,但在某些情况下磁盘上已经没有可用的空闲分区了,致使我们不能把它扩大. 因此,在这种情况下,我们可 ...
- git服务器的搭建
http://blog.jobbole.com/25944/ 1,概念 git服务器:就是一个仓储,一个大家都可以访问的公共仓储,大家可以从这个仓储中拉取和推送数据. 协议: 与gist服务通讯的仓储 ...
- 也说面试 - 一个努力的iOS Dev
你们在金色的余晖中回家,而我却在银色的温柔中,匆匆潜行-----这是我的现状. 今年的招工形式不是很好,难找工作:也难招人.写这篇博客,是为了给各位在找工作的iOS dev 一些参考. 上篇:换坑(去 ...
- JSP页面数据展示:分组数据展示
一.描述: 页面上要展示的数据只要写好sql从数据库查出来即可,但是展示有时候不是太好处理.比如工作中遇到的这种情况:有一个问题处理的流程,其中需要选择下一处理人,这些处理人要以部门的形式分组展示,实 ...
- boxes
boxes [英][bɒksɪz][美][bɑ:ksɪz] n.盒( box的名词复数 ); 一盒; 电视; 小亭; v.把…装入盒[箱,匣]中( box的第三人称单数 ); 拳击; 以上结果来自 ...
- Oracle相关账户几个语句
Oracle安装完成后,在“开始”里找到SQL Plus运行,要求输入帐号和密码,用system/密码连接. 1.Oracle里有一个默认的scott账户密码tiger,用该账户连接: CONN 用户 ...