我目前使用nodejs创建一些实验项目。我已经用Spring编写了很多Java EE Web应用程序,并赞赏那里的依赖注入的简易性。
现在我很好奇:如何使用节点进行依赖注入?或者:我什至需要吗?是否存在替代概念,因为编程风格不同?
到目前为止,我在谈论简单的事情,例如共享数据库连接对象,但是我还没有找到一个令我满意的解决方案。
简而言之,您不需要像C#/ Java中那样的依赖项注入容器或服务定位器。由于Node.js利用module pattern
,因此无需执行构造函数或属性注入。虽然您仍然可以。
JS的伟大之处在于,您可以修改几乎所有内容以实现所需的功能。在进行测试时,这很方便。
看我非常very脚的人为例子。
MyClass.js
:
var fs = require('fs');
MyClass.prototype.errorFileExists = function(dir) {
var dirsOrFiles = fs.readdirSync(dir);
for (var d in dirsOrFiles) {
if (d === 'error.txt') return true;
}
return false;
};
MyClass.test.js
:
describe('MyClass', function(){
it('should return an error if error.txt is found in the directory', function(done){
var mc = new MyClass();
assert(mc.errorFileExists('/tmp/mydir')); //true
});
});
注意如何MyClass
依赖fs
模块?正如@ShatyemShekhar所提到的,您确实可以像使用其他语言一样进行构造函数或属性注入。但这在Javascript中不是必需的。
在这种情况下,您可以做两件事。
您可以对fs.readdirSync
方法进行存根,也可以在调用时返回完全不同的模块require
。
方法1:
var oldmethod = fs.readdirSync;
fs.readdirSync = function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
*** PERFORM TEST ***
*** RESTORE METHOD AFTER TEST ****
fs.readddirSync = oldmethod;
方法2:
var oldrequire = require
require = function(module) {
if (module === 'fs') {
return {
readdirSync: function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
};
} else
return oldrequire(module);
}
关键是利用Node.js和Javascript的功能。请注意,我是CoffeeScript专家,所以我的JS语法在某处可能不正确。另外,我并不是说这是最好的方法,而是一种方法。Javascript专家可能会与其他解决方案配合使用。
更新:
这应该解决您有关数据库连接的特定问题。我将为您创建一个单独的模块,以封装您的数据库连接逻辑。像这样:
MyDbConnection.js
:(请务必选择一个更好的名称)
var db = require('whichever_db_vendor_i_use');
module.exports.fetchConnection() = function() {
//logic to test connection
//do I want to connection pool?
//do I need only one connection throughout the lifecyle of my application?
return db.createConnection(port, host, databasename); //<--- values typically from a config file
}
然后,任何需要数据库连接的MyDbConnection
模块都将仅包含您的模块。
SuperCoolWebApp.js
:
var dbCon = require('./lib/mydbconnection'); //wherever the file is stored
//now do something with the connection
var connection = dbCon.fetchConnection(); //mydbconnection.js is responsible for pooling, reusing, whatever your app use case is
//come TEST time of SuperCoolWebApp, you can set the require or return whatever you want, or, like I said, use an actual connection to a TEST database.
不要逐字遵循此示例。在尝试传达您利用module
模式来管理依赖项时,这是一个la脚的例子。希望这会有所帮助。
问题内容: 只是想知道我们如何在node.js 8中导入模块-我们仍在使用吗? 还是我们仍然需要babel来使用? 我一直在挖掘,但似乎没有答案。如果我们仍然必须使用require,为什么节点还不能实现? 问题答案: UPDATE-2018.11.15↓ 简短答案 我们仍在使用 长答案 ESM加载已部分降落在2017年9月发布的node 上。正因为如此,它已经成为规范的一部分,并且已经作为实验功能
另一方面,如果我只是使用一个单例类来返回总线实例,那么我就不需要编写像依赖注入那样多的代码行。 所以我的问题是“为什么或者如何使用依赖注入来注入单例类实例更好?”
我正在通过Kafka快速入门: http://kafka.apache.org/07/quickstart.html 和基本的消费者群体示例: https://cwiki.apache.org/confluence/display/KAFKA/Consumer组示例 我已经将消费者和消费者线程池编码如下: 其他几个方面:我正在使用Spring来管理我的动物园管理员: 我正在用Maven和OneJa
我很困惑绑定如何与Guice一起工作。我是一家公司的初级开发人员,我正在查看我们的代码库,试图了解我们是如何在应用程序中实现Guice的。 我正在阅读关于Guice注入的指南:https://www.tutorialspoint.com/guice/guice_first_application.htm,这看起来和我们公司的做法不一样。 第一步说创建接口。我们确实在模块类中有一个扩展的绑定。 例:
我是一个初学者(学习网络开发大约15天),我目前正在学习React和其他东西,如果这听起来太琐碎,我很抱歉。 我试图理解devDependness和依赖之间的区别,以及相同的正确用法。 我试图从文档和stackoverflow问题中找出答案,但我不能100%确定我是否有这个权利。因此,请回顾我现在的理解,并让我知道,如果我有这个权利到目前为止。 定义 > DevDependencies:简化我的开
我不太明白它解决了什么问题。它看起来像是这样说:“Hi.当你运行到这个函数时,返回一个对象,它是这种类型的,并且使用这些参数/数据。” 但是...我为什么要用这个?注我也从来不需要使用,但我理解这是为了什么。 在构建一个网站或桌面应用程序时,有哪些实际情况可以使用DI?我可以很容易地想出为什么有人想在游戏中使用接口/虚拟函数的例子,但是在非游戏代码中使用这种方法是极其罕见的(非常罕见,以至于我都记