Nodejs,最好有很多相同的要求或使用一个句柄?
形象这个esctructure:
- app.js - core/ - service_1.js - service_2.js - service_3.js - service_4.js - service_5.js - modules/ - module_1.js - module_2.js - module_3.js
app.js使用3个模块,所以应用程序的代码是:
var m1 = require('./modules/module_1'); var m2 = require('./modules/module_2'); var m3 = require('./modules/module_3'); m1.exec(); m2.exec(); m3.exec();
而每个模型使用所有的服务,所以他们需要:
var s1 = require('./../core/service_1'); var s2 = require('./../core/service_2'); var s3 = require('./../core/service_3'); var s4 = require('./../core/service_3'); var s5 = require('./../core/service_3'); // some stuff...
所以,我需要知道这是最好的方式来处理,或者做一个“服务pipe理器”,如:
app.js
var m1 = require('./modules/module_1'); var m2 = require('./modules/module_2'); var m3 = require('./modules/module_3'); var serviceManager = { service_1 : require('./core/service_1'), service_2 : require('./core/service_2'), service_3 : require('./core/service_3'), service_4 : require('./core/service_4'), service_5 : require('./core/service_5') }; m1.load(serviceManager); m2.load(serviceManager); m3.load(serviceManager); m1.exec(); m2.exec(); m3.exec();
我把每一个模型 :
var serviceManager = null; exports.load = function(services) { serviceManager = services; } // some stuff...
如果我几乎在所有文件中都使用这个类,什么是最好的?
a)获得很多'要求'。
b)一个把“需要”放一次的句柄。
c)另一个解决scheme。
我会去很多的require
。 没关系,因为Node.js在第一次加载后caching模块。
从Node.js文档:
模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。
dependency injection对此非常有用。 我用过并推荐胰岛素 。 这使得在dependency injection容器中加载每个模块非常容易,然后只需在您编写的模块中命名依赖关系。
你可以做如下的事情:
'use strict'; require('insulin').factory('myService', myServiceFactoryFunction); function myServiceFactoryFunction(dependencyOne, dependencyTwo) { // Do something with your dependencies. }
这样,您只需要在文件的顶部一次,而不必在该文件中再次执行该操作。
正如其他答案中提到的那样,节点caching了所有需要的东西,所以每次需要注入容器时,都会得到相同的结果。 这使得构build应用程序变得非常快捷,而且不需要随处添加任何东西,也无需传递任何东西。
稍后,要获得上面创build的模块,只需在需要的地方执行以下操作:
'use strict'; require('insulin').factory('mySecondService', mySecondServiceFactoryFunction); function mySecondServiceFactoryFunction(myService) { // myService is now available in this module }
与大多数其他dependency injection器一样,如果您由于某种原因不希望或不能在应用程序的某个部分dependency injection,则可以使用其他方法。 你可以做这样的事情:
const insulin = require('insulin'); const myDependency = insulin.get('someModule');
需要的地方。
对我来说最好的部分是代码变得非常干净,只要查看传递给工厂函数的参数,就可以很容易地告诉给定文件的依赖关系。