【问题标题】:node.js module dependency overriding or injection or IoCnode.js 模块依赖覆盖或注入或 IoC
【发布时间】:2015-07-16 10:52:45
【问题描述】:

问题与架构设计模式有关。案例是我正在构建一个 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 中的依赖注入”主题。

【问题讨论】:

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


【解决方案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);

}

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

【讨论】:

    【解决方案2】:

    可能是 DI 是你想要的东西,我遇到了一个名为 Coffee Sweetener 的不错的模块,这些示例在咖啡脚本中但并不重要,因为你可以将它们编译为普通的 javascript。

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

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

    【讨论】:

    • 我想你没有理解我的问题。我在询问 node.js 中的编程方法。你在建议你正在使用的图书馆。两个不相关的话题,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多