问题与架构设计模式有关。我正在构建一个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中的依赖注入”主题发表评论。
答案 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调用。如果您也在寻找相同的示例,请告诉我。