我发现使用依赖注入来传递东西是最好的样式。确实看起来像您拥有的东西:
// App.jsmodule.exports = function App() {};// Database.jsmodule.exports = function Database(configuration) {};// Routes.jsmodule.exports = function Routes(app, database) {};// server.js: composition rootvar App = require("./App");var Database = require("./Database");var Routes = require("./Routes");var dbConfig = require("./dbconfig.json");var app = new App();var database = new Database(dbConfig);var routes = new Routes(app, database);// Use routes.这有很多好处:
- 它将迫使您将系统分为具有明确依赖关系的组件,而不是将依赖关系隐藏在文件调用它们
require("databaseSingleton")或更糟的位置的中间global.database
。 - 它使单元测试很简单:如果我想测试
Routes
孤立地看,我可以用假注入它app
和database
PARAMS和测试只有Routes
代码本身。 - 它将所有对象图布线都放在一个位置,即合成根(在本例中为
server.js
应用程序入口点)。这使您可以查看一个地方,以查看系统中的所有组件如何组合在一起。
我所见到的对此更好的解释之一是对 .NET 优秀著作 Dependency Injection的 作者Mark
Seeman的采访。它同样适用于Javascript,尤其是Node.js:通常用作经典服务定位器,而不仅仅是模块系统。 __
require



