在Nodejs中具有依赖注入的模型

Mik*_*ite 1 dependency-injection node.js

将依赖项注入模型的最佳实践是什么?特别是,如果他们的getter是异步的,如同mongodb.getCollection()

重点是一次注入依赖项

var model = require('./model')({dep1: foo, dep2: bar});
Run Code Online (Sandbox Code Playgroud)

并调用所有成员方法,而不必将它们作为参数传递.我也不希望每个方法都以异步getter的瀑布开始.

我最终得到了一个专用的exports包装器,它代理所有调用并传递异步依赖项.

然而,这会产生很多开销,重复很多,我通常不喜欢它.

var Entity = require('./entity');

function findById(id, callback, collection) {
    // ...
    // callback(null, Entity(...));
};

module.exports = function(di) {
    function getCollection(callback) {
        di.database.collection('users', callback);
    };

    return {
        findById: function(id, callback) {
            getCollection(function(err, collection) {
                findById(id, callback, collection);
            });
        },
        // ... more methods, all expecting `collection`
    };
};
Run Code Online (Sandbox Code Playgroud)

注入依赖项的最佳实践是什么,尤其是那些具有异步getter的依赖项?

Mat*_*rte 6

如果你需要支持单元测试,那么像javascript这样的动态语言中的依赖注入可能比它的价值更麻烦.请注意,您需要的其他模块几乎不会使用您在Java,.NET和其他静态编译语言中看到的DI模式.

如果您想模拟行为以隔离特定的代码单元以进行测试,请参阅"sinon"模块http://sinonjs.org/.它允许您动态交换进/出拦截器,这些拦截器既可以监视方法调用,也可以完全替换它们.在实践中,您可以编写一个需要模块的mocha测试,然后需要一个在代码中使用的模块.使用sinon在该模块上监视或存根方法,因此,您可以隔离代码.

有一个场景我已经无法与兴农完全隔离第三方代码,这是当行为需要()荷兰国际集团一模块执行一些行为,你不希望在您的测试运行.对于那种情况下,我做了一个名为"mockrequire"超级单模https://github.com/mateodelnorte/mockrequire,允许你提供需要的,而不是实际的模块内嵌模拟.您可以提供一个使用来自sinon的间谍或存根的模拟,并且具有与所有其他测试相同的语法和模式.

希望这可以回答你帖子中的基本问题.;)