2015-02-05 31 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