node.js模块依赖性覆盖或注入或IoC

时间:2015-05-06 10:42:21

标签: javascript node.js dependency-injection module inversion-of-control

问题与架构设计模式有关。我正在构建一个node.js工具,它可以重用下面几个npm发布的模块。我想提供一种机制来扩展我工具中所有模块之间的依赖关系。

目前问题是我的工具中的所有模块都相互通信,因此几乎没有文件具有:

var dep = require('dependency1');

他们从npm按原样加载dependency1。我想提供一个扩展依赖性的函数,例如

function (dependency) {
    dependency.customFeature = ...;
    dependency.customizeSettings(...);
    return dependency;
}

并在我的工具中的所有模块中提供此覆盖依赖项。

研究

我找到了this question,其中有些人声称我不需要在node.js中依赖注入,我真的不相信这个意见,因为我不知道如何实现我的目标没有DI。到目前为止,我认为我需要某种IoC。

解决方案草案

我在考虑一个最初会调用的factory模块 - 它会加载所有原始依赖项,在依赖项上执行装饰/扩展函数,存储它们并让它们可供其他模块使用。所有其他模块都会向工厂询问扩展模块,而不是加载原始依赖项。

Afaik,node.js将已加载的模块存储在内存中,因此上面的解决方案应该可行,但我不确定它是否正确。

解决方案草案有效(编辑

我已经实现了上述解决方案,它完美无缺。 Node.js模块在内存中重用。

请建议您在此案例中使用的解决方案,并对“Node.js中的依赖注入”主题发表评论。

2 个答案:

答案 0 :(得分:1)

我认为这个问题非常有用,但在另一篇文章Do I need dependency injection in NodeJS, or how to deal with ...?

中得到了很好的回答

在坚实的基础上,按照您提到的解决方案的一行,更简单的方法是覆盖require函数。我认为优雅而简单。 这是一个帖子的示例表单:

var oldrequire = require
require = function(module) {
    if (module === 'fs') {
        return {
            readdirSync: function(dir) { 
                return ['somefile.txt', 'error.txt', 'anotherfile.txt']; 
            };
        };
    } else
        return oldrequire(module);

}

当然,您可以找到这个想法的许多变体,但这是概念

答案 1 :(得分:-1)

可能是DI你想要的东西,我遇到了一个名为Coffee Sweetener的好模块,这些例子都是咖啡脚本,但几乎不重要,因为你可以将它们编译成简单的javascript。

它使您可以使用.map方法定义所有模块,然后您可以从同一个Object获取这些方法的实例。

实际上,其他模块也可以定义自己的依赖项,而无需在同一文件中进行require调用。如果您也在寻找相同的示例,请告诉我。

相关问题