【问题标题】:nodejs: Node modules vs singleton classesnodejs:节点模块与单例类
【发布时间】:2012-07-29 13:21:04
【问题描述】:
PRE:我读过NodeJS modules vs classes,但这更具体。
作为 Node 重构的一部分,我有几个应用程序服务(在 DDD 术语中),它们在技术上实现为 Node 模块。
因为(在 DDD 世界中,可能是其他任何事情)应用程序服务应该是单例的,并且由于 Node 模块保证只有 1 个“实例”,所以在我看来这很合适(模块简单地实现'singletonness')
除了纯粹的观点之外,有什么理由我应该考虑将这些应用程序服务重构为适当的单例类(只要 javascript 中可以保证“单例”)?
【问题讨论】:
标签:
node.js
refactoring
domain-driven-design
node-modules
【解决方案1】:
查看Node's module caching caveats 了解模块的“单一性”会崩溃的情况。
如果您始终在单个包中使用文件路径(以 ./、../ 或 / 开头)引用单例模块,那么您是安全的。
如果您的服务被包装在一个包中以供其他模块使用,您最终可能会得到多个单例实例。
假设我们发布了这个甜蜜的服务库:
service-lib/
⌞ package.json
⌞ service.js
service.js:
var singleton = {};
module.exports = singleton;
在此应用中,server.js 和 other.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 有详细信息。