Node.js模块依赖的覆盖、注入或控制反转

3

这个问题与 架构设计模式 有关。我的情况是,我正在构建一个基于node.js的工具,它在下面重用了几个已发布的npm模块。我希望提供一种机制来扩展所有模块之间的依赖关系。

目前的问题是,我的工具中的所有模块都彼此通信,因此有一些文件包含:

var dep = require('dependency1');

他们直接从npm中加载dependency1。我想提供一个函数来扩展这个依赖项,例如:

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

我希望我的工具中的所有模块都能使用这个被覆盖的依赖项。

研究

我发现了这个问题,一些人声称在node.js中我不需要依赖注入,但我并不完全相信这种观点,因为我不知道如何在没有依赖注入的情况下实现我的目标。到目前为止,我认为我需要某种IoC。

解决方案草案

我想到了一个factory模块,最初会被调用-它将加载所有原始依赖项,在依赖项上执行修饰/扩展函数,存储它们,并让它们可供其他模块使用。所有其他模块将向工厂请求扩展模块,而不是加载原始依赖项。

据我所知,node.js将已加载的模块存储在内存中,因此上述解决方案应该可以工作,但我不确定是否是正确的方法。

解决方案草案成功(编辑

我已经实施了上述解决方案,它完美地工作。Node.js模块在内存中被重用。


请提供您在此情况下使用的解决方案,并对“Node.js中的依赖注入”主题发表评论。


我已经为JavaScript应用程序创建了一个IoC容器。请访问http://blog.wolksoftware.com/introducing-inversifyjs查看。 - Remo H. Jansen
2个回答

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

也许你需要 DI,我发现了一个不错的模块叫做Coffee Sweetener,虽然示例是用 CoffeeScript 写的,但并不重要,因为你可以将它们编译成普通的 JavaScript。

它让你使用 .map 方法定义所有模块,然后你可以从同一对象中获取这些方法的实例。

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


我想你没有理解我的问题。我在询问node.js的编程方法。而你正在建议你正在使用的库。两个无关的话题,非常抱歉。 - ducin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接