这实际上不是依赖注入,而是服务位置:您的其他模块通过字符串“键”请求“类”并取回“服务定位器”(在本例中为 RequireJS)已连接到的实例为他们提供。
依赖注入将涉及返回MyModel
构造函数,即return MyModel
,然后在中央组合根中将的实例MyModel
注入其他实例。我在这里整理了一个如何工作的示例:https ://gist.github.com/1274607 (也在下面引用)
这样,组合根决定是否MyModel
为每个需要它的类分发一个实例(即使其成为单例作用域)或新实例(实例作用域),或者介于两者之间。该逻辑既不属于 MyModel 的定义,也不属于请求它的实例的类。
(旁注:虽然我没有使用过,wire.js是一个成熟的 JavaScript 依赖注入容器,看起来很酷。)
尽管您正在做的事情似乎有点迂回,但您不一定会像您一样使用 RequireJS 来滥用它,即声明一个类而不是返回它的一个新实例。为什么不只做以下事情?
define(function () {
var value = 10;
return {
doStuff: function () {
alert(value);
}
};
});
您可能缺少的类比是模块等效于大多数其他语言中的“命名空间”,尽管您可以将函数和值附加到命名空间。(所以更像 Python 而不是 Java 或 C#。)它们不等同于类,尽管正如您所展示的,您可以使模块的导出等于给定类实例的导出。
因此,您可以通过将函数和值直接附加到模块来创建单例,但这有点像使用静态类创建单例:它非常不灵活,通常不是最佳实践。但是,大多数人确实将他们的模块视为“静态类”,因为正确地构建依赖注入系统需要从一开始就进行大量思考,这在 JavaScript 中并不是真正的规范。
这是https://gist.github.com/1274607内联:
// EntryPoint.js
define(function () {
return function EntryPoint(model1, model2) {
// stuff
};
});
// Model1.js
define(function () {
return function Model1() {
// stuff
};
});
// Model2.js
define(function () {
return function Model2(helper) {
// stuff
};
});
// Helper.js
define(function () {
return function Helper() {
// stuff
};
});
// composition root, probably your main module
define(function (require) {
var EntryPoint = require("./EntryPoint");
var Model1 = require("./Model1");
var Model2 = require("./Model2");
var Helper = require("./Helper");
var entryPoint = new EntryPoint(new Model1(), new Model2(new Helper()));
entryPoint.start();
});