我只是触及dependency injection
,
然后我认为CommonJs和AMD有点dependency injection
。
因为在任一标准下定义模块时,必须首先加载其依赖模块。
您定义的模块应仅公开抽象API,可能不太详细
我是对的吗?我错过了什么吗?
答案 0 :(得分:1)
它可以用于某些工作但不是真的。
依赖注入通常与编译代码有关。在大多数情况下,更改引用的二进制文件需要重新编译和重新部署。 dependency-injection允许选择在运行时通过文本文件使用哪个二进制文件,从而无需重新编译产品。
通过像amd这样的库使用requirejs,您看到的模式是通过约定直接引用,感觉很像项目引用。
对于jquery依赖项目,您确实开始通过config查看库交换。在这种情况下,通过更改代码来更新引用的路径。虽然这与dependency-injection类似,但它是代码更改。例如,以下内容定义了modernizr
中requirejs的路径require.config({
paths: {
modernizr: '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.7.1/modernizr.min'
}
});
要更改依赖项,开发人员需要更改 代码而不是。
答案 1 :(得分:0)
你可以这样想:
AMD对JavaScript有什么:
#include
是C import
是Java require
是NodeJS 实际上它可以用来注入依赖关系但是当被认为是DI机制 - 而不仅仅是模块加载器 - 它鼓励将每个模块编写为Singleton。
示例:
define('a', function () {
return {
doX: function () { ... }
};
});
define('b', ['a'], function (a) {
return {
doY: function () {
a.doX();
}
};
});
您可以说您已将a
注入b
但由于只有a
的一个副本 - 一个单身人士 - 而AMD知道每次模块将其用作依赖项时,它将始终使用相同的内容。
如果您改为:
define('A', function () {
function A(options) { // some constructor/factory method
return {
doX: function () {...}
}
}
return A;
});
define('b', ['A'], function (A) {
if (<some condition>) {
var customOptions = {<some options>}
var a1 = new A(customOptions);
return {
doY: function () {
a1.doX();
}
};
}
var defaultOptions = {<default>}
var a2 = new A(defaultOptions);
return {
doY: function () {
a2.doY();
}
}
});
在第二个示例中,您可以创建模块A的多个实例,因为它返回构造函数/工厂方法而不是实例。
为了便于测试避免单身人士通常是个好主意,因为这意味着你可以实际注入不同的实例甚至是存根。如果您尝试注入的模块是单身人士,这几乎是不可能的。