如何在Nodejs中进行有效的依赖注入?

Rea*_*ing 4 javascript dependency-injection node.js

让我们从一些参考代码开始

var express = require('express');  
var app = express();  
var session = require('express-session');

app.use(session({  
  store: require('connect-session-knex')()
}));
Run Code Online (Sandbox Code Playgroud)

我在这里有几个问题,如果你知道答案,我想回答一下:

每次require调用Nodejs时,是否都是命名依赖注入?或依赖注入的真正含义是什么?

我之所以这样问,是因为我一直在阅读关于Node的内容,我看到有人在谈论这个modulemodule.export模式,我很困惑,这module是一样的dependency吗?

因此,我需要的是对依赖注入的明确解释,以及何时/何时需要注入依赖项...

jfr*_*d00 9

依赖注入与正常模块设计有些相反.在正常的模块设计中,模块用于require()加载所需的所有其他模块,目的是使调用者能够轻松使用您的模块.调用者可以require()在您的模块中,您的模块将加载所需的所有其他内容.

使用依赖注入,而不是模块加载它需要的东西,调用者需要传入模块所需的东西(通常是对象).这可以使某些类型的测试更容易,并且可以更容易地模拟某些用于测试目的的东西.

每次在Nodejs中调用require时,是否都是命名依赖注入?或依赖注入的真正含义是什么?

require()不可以.当一个模块执行a 加载它自己的依赖项时,它不是依赖项注入.

我之所以这样问,是因为我一直在阅读Node,我看到有人在谈论模块或module.export模式,我很困惑,模块和依赖是一样的吗?

模块与依赖项不同.正常的模块设计允许您require()只使用模块并返回一系列可以使用的导出.模块本身处理其自身依赖项的加载(通常使用require()模块的内部).

这里有几篇文章讨论了使用依赖注入的一些优点/缺点.最好的我可以告诉主要的优点是通过允许更容易模拟依赖对象(如数据库)来简化单元测试.

何时使用依赖注入

什么时候不适合使用依赖注入

我们为什么要使用依赖注入


使用依赖注入的经典案例是模块依赖于数据库接口.如果模块加载它自己的数据库,那么该模块基本上是硬连接到该特定数据库.模块内置的体系结构不允许调用者指定应使用的存储类型.

但是,如果设置了模块,那么当调用者加载并初始化模块时,它必须传入一个实现特定数据库API的对象,然后调用者可以自由决定应该使用什么类型的数据库.可以使用符合API合同的任何数据库.但是,调用者负担选择和加载特定数据库的负担.也可能存在混合情况,其中模块具有将在默认情况下使用的内置数据库,但是如果在模块构造函数或模块初始化中提供,则调用者可以提供将使用的对象.