本篇文章来自对 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. C#之Winform中treeview控件绑定数据库

    private DataSet ds; private SqlDataAdapter sqlDataAdapter1; private int maxnodeid; private void Form ...

  2. PHP中,文件上传实例

    PHP中,文件上传一般是通过move_uploaded_file()来实现的.  bool move_uploaded_file ( string filename, string destinati ...

  3. Couldn't resolve Mac Server "mymac"

    vs2015创建一个iphone app ,Couldn't resolve Mac Server “mymac” 伤.下班走人

  4. java-web乱码问题解决

    <一>乱码问题(设置tomcat uriencoding=’utf-8’); 统一设置编码过滤器 <1>get请求: request.setCharacterEncoding( ...

  5. oracle11g 修改字符集

    查看当前字符集SQL语句: select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; 修改字符集操作如下,首 ...

  6. Selenium2+python自动化9-CSS定位语法

    前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...

  7. javascript 网页运行代码效果

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. python zookeeeper 学习和操作

    1.zookeeeper介绍 ZooKeeper是一个为分布式应用所设计的分布的.开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的 ...

  9. iOS获取当前app的名称和版本号

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; CFShow(infoDictionary); // ap ...

  10. SQL保留关键字不能用作表名

    com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'User' 附近有语法错误. 一看就是SQL语句错误,发现控制台console上打印出来的S ...