想象一下这种结构:
- 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...
所以,我需要知道这是否是处理该问题的最佳方法,或者可能是" serviceManager"像:
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)另一种解决方案。
答案 0 :(得分:2)
依赖注入对此非常有用。我已经使用并推荐了insulin。这使得在依赖注入容器中加载每个模块变得非常容易,然后只在您编写的模块中命名依赖项。
您可能会执行以下操作:
'use strict';
require('insulin').factory('myService', myServiceFactoryFunction);
function myServiceFactoryFunction(dependencyOne, dependencyTwo) {
// Do something with your dependencies.
}
这样,您需要在文件顶部执行一次,而不必在该文件中再次执行此操作。
正如其他一个答案所述,节点缓存了所需的所有内容,因此每次需要注入容器时,都会获得相同的注释容器。这使得构建应用程序变得非常快速和轻松,无需在任何地方需要任何东西或传递任何东西。
稍后,要获得上面创建的模块,您只需执行以下操作:
'use strict';
require('insulin').factory('mySecondService', mySecondServiceFactoryFunction);
function mySecondServiceFactoryFunction(myService) {
// myService is now available in this module
}
胰岛素和大多数其他依赖注射器一样,如果由于某些原因不希望或不能依赖于应用程序某些部分的注射,则可能使用其他方法。你可以这样做:
const insulin = require('insulin');
const myDependency = insulin.get('someModule');
需要的地方。
对我来说最好的部分是代码变得非常干净,只需查看传递给工厂函数的参数,就可以很容易地判断给定文件的依赖关系。
答案 1 :(得分:1)
我会选择很多require
。没关系,因为Node.js在首次加载后会缓存模块。
来自Node.js文档:
模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require(' foo')将获得完全相同的返回对象,如果它将解析为同一文件。