2012-07-31 90 views
5

PRE:我讀過NodeJS modules vs classes,但這更具體。nodejs:節點模塊vs單例類

作爲Node中一些重構的一部分,我有一些應用服務(DDD術語),它們在技術上作爲Node模塊實現。由於(在一個DDD世界中,可能是任何其他的事情)應用服務應該是單身人士,並且由於節點模塊只能保證是'實例',所以在我看來這是一個合適的模塊瑣碎地實現'單身')

除了純粹的立場,是否有任何理由爲什麼我應該考慮重構這些應用服務作爲適當的單例類(儘管在javascript中可以保證'singletonness')?

回答

6

檢查出Node's module caching caveats模塊的「單一」的細節將打破的情況。

如果您始終將一個包中的文件路徑(從./,..//開始)引用到您的單例模塊中,那麼您就很安全。

如果你的服務被封裝在一個被其他模塊使用的包中,你最終可能會得到你的單例的多個實例。

說,我們發佈這個甜蜜的服務庫:

service-lib/ 
⌞ package.json 
⌞ service.js 

service.js: 
    var singleton = {}; 
    module.exports = singleton; 

在這個應用程序,server.jsother.js將得到我們的服務不同實例:

app/ 
⌞ server.js 
⌞ node_modules/ 
    ⌞ service-lib/ 
    ⌞ service.js 
    ⌞ other-package/ 
    ⌞ other.js 
    ⌞ node_modules/ 
     ⌞ service-lib/ 
     ⌞ service.js 

雖然這個程序將份額一個實例:

app/ 
⌞ server.js 
⌞ node_modules/ 
    ⌞ service-lib/ 
     ⌞ service.js 
    ⌞ other-package/ 
     ⌞ other.js 

相同的npm install相同的app可能會導致根據版本的依賴關係的目錄結構。節點的folders doc有詳細信息。