2015-02-05 62 views
2

我明白了,我希望有一个工厂在一个地方管理我所有模块的依赖项,而不是使用大量的语句在我的代码中的地方。Common.js和Node.js的工厂模式

我已经看了依靠AMD的一些方法,但我想知道如何通过与OOB模块加载,我认为它使用Node.js的common.js /快递组合去做。

我一直在考虑做这样的事情的:

module.exports = { 
lib:[], 
load:function(name){ 
    if(this.lib[name]!==undefined && this.lib[name]!==null){ 
     return this.lib[name]; 
    } 

    switch(name) 
    { 
     case 'express': 
      this.lib[name] = require('express'); 
      break; 
     case 'morgan':  
      this.lib[name] = require('morgan'); 
      break; 
     case 'body-parser': 
      this.lib[name] = require('body-parser'); 
      break; 
    } 
    console.log(this.lib); 
    return this.lib[name]; 
    } 
}; 

有人说这比工厂更其调解模式,因此无论哪种方式,我只是想说明我的观点。

我的基本要求是处理系统中的所有从一个地方的依赖关系,如果我需要改变依赖我只是改变它在这个文件,并通过整个系统自动更新。

那么有没有更好的方法来处理这个问题?任何已经完成这种方法的实现?

谢谢!

+0

以下是在JS http://thenodeway.io/posts/designing-factories/中制作工厂模式的方法。但通常人们对每个文件都要求,你可以尝试requireJS http:// requirejs。org/ – Osukaa 2015-03-23 22:01:28

+0

感谢这篇文章看起来很有趣,而且我想出了一些与文章 – 2015-03-24 20:21:23

回答

2

技术上这是require()在内部做的。

require('foo'); require('foo') 

保证它只会加载并运行foo一次。第二次调用将从其内部数组中返回一个缓存副本。

通过要求JS文件或节点模块来重新导出实际使用的模块(例如require('./my-express-wrapper')),您可以实现相同的命名间接(和API适配器,如果您决定更改实现而不更改调用方)的require('express'))。

如果我需要改变一个依赖关系,我只是改变它在这个文件上,并自动更新整个系统。

我会担心这会导致代码是惊人的:

require('factory').load('body-parser'); // loads Formidable!? 

我看不出有什么好处在具有间接的这种层:

  • 即使在最好的情况下,的替换它可以节省很少的工作,因为在大多数文本编辑器中,项目全局替换为require('foo')require('bar')是一件容易的事情。

  • 替换模块(这是不太可能是100%兼容)的硬的部分是让现有的代码正确地使用它。这不能通过使用工厂模式来避免。您需要以任何一种方式编写适配器,有时甚至可能更好地改变模块的用途,而不是为可能不太好的API编写仿真层。

+0

中提到的几个非常相似的想法,您可能希望更改对“生产”中“运行时”的依赖“? – 2015-04-23 00:43:27

+0

@ jack.the.ripper我不确定是否理解正确 - 您想更改应用程序各部分的实现而不重新启动它?如果你只是在某些实现之间进行交换(比如说用于输出的JSON或XML序列化程序),那么常规的多态/依赖注入或策略模式就可以实现这一点。通过'require'这样做会很奇怪。 – Kornel 2015-04-23 23:00:47

+0

这就是我想要某种工厂模式作为控制反转实现的原因,因为我不是在JavaScript中的DI的巨大粉丝 – 2015-04-24 23:13:44