Nodejs,更好的有很多相同的需求或使用句柄?

时间:2016-10-11 15:10:15

标签: javascript node.js model-view-controller module

想象一下这种结构:

- 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)另一种解决方案。

2 个答案:

答案 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')将获得完全相同的返回对象,如果它将解析为同一文件。