我只是触及了dependency injection的概念,
然后我认为CommonJ和AMD是一种dependency injection。
因为在任何标准下定义模块时,都必须先加载它的依赖模块。
您定义的模块应该只公开抽象的API,而不太可能公开细节。
我说的对吗?我错过了什么吗?
发布于 2013-12-27 12:55:15
它可以作为这样的一些工作,但不是真的。
依赖注入通常与编译后的代码有关。在大多数情况下,更改引用的二进制文件需要重新编译和重新部署。依赖注入允许的是通过文本文件选择在运行时使用的二进制文件,从而消除了重新编译产品的需要。
使用amd通过像所需这样的库,您通常看到的模式是通过约定直接引用,这感觉很像项目引用。
对于jquery-dependent项目,您确实可以看到通过配置进行的库交换。在这种情况下,通过更改代码更新指向引用的路径。虽然这与依赖注入类似,但它是一个代码更改。例如,以下内容在现代化中定义了所需的路径
require.config({
paths: {
modernizr: '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.7.1/modernizr.min'
}
});要更改依赖项,开发人员需要更改代码,而不是配置。
发布于 2016-02-12 07:27:08
你可以这样想:
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的拷贝--一个单例--这个a知道它会在每次模块使用它作为依赖项时都使用相同的。
如果你这样做了:
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的多个实例,因为它返回构造函数/工厂方法,而不是实例。
为了方便测试,避免单例通常是个好主意,因为这意味着您实际上可以注入不同的实例,甚至存根。如果您要注入的模块是Singleton,则这几乎是不可能的。
https://stackoverflow.com/questions/20786721
复制相似问题