gpt4 book ai didi

javascript - 使用 RequireJS 进行依赖注入(inject)

转载 作者:IT王子 更新时间:2023-10-29 03:13:29 26 4
gpt4 key购买 nike

我可以扩展多少 RequireJS 来为我的应用程序提供依赖注入(inject)?举个例子,假设我有一个我想成为单例的模型。不是 self 执行的 getInstance() 类型的单例中的单例,而是上下文强制的单例(每个“上下文”一个实例)。我想做类似...

require(['mymodel'], function(mymodel) {
...
}

并让 mymodel 成为 MyModel 类的一个实例。如果我要在多个模块中执行此操作,我希望我的模型是相同的共享实例。

我已经通过像这样制作 mymodel 模块成功地完成了这项工作:

define(function() {
var MyModel = function() {
this.value = 10;
}
return new MyModel();
});

这种用法是否符合预期且很常见,还是我在滥用 RequireJS?有没有更合适的方法可以使用 RequireJS 执行依赖注入(inject)?谢谢你的帮助。仍在努力理解这一点。

最佳答案

这实际上不是依赖注入(inject),而是服务位置:您的其他模块通过字符串“键”请求“类”,并取回“服务定位器”(在本例中为 RequireJS)具有的它的实例有线为他们提供服务。

依赖注入(inject)将涉及返回 MyModel 构造函数,即 return MyModel,然后在中央 组合根 中注入(inject) 的实例MyModel 到其他实例。我在这里整理了一个示例,说明它是如何工作的:https://gist.github.com/1274607 (也在下面引用)

这样,组合根确定是分发 MyModel 的单个实例(即使其成为单例范围)还是为需要它的每个类分发新实例(实例范围),或者介于两者之间.该逻辑既不属于 MyModel 的定义,也不属于要求其实例的类。

(旁注:虽然我没用过,wire.js 是一个成熟的 JavaScript 依赖注入(inject)容器,看起来很酷。)


你不一定像你一样通过使用 RequireJS 来滥用它,尽管你所做的似乎有点迂回,即声明一个类而不是返回它的一个新实例。为什么不只执行以下操作?

define(function () {
var value = 10;

return {
doStuff: function () {
alert(value);
}
};
});

您可能忽略的类比是,模块等同于大多数其他语言中的“命名空间”,尽管您可以将函数和值附加到命名空间。 (因此更像 Python 而不是 Java 或 C#。)它们不等同于类,尽管正如您所展示的,您可以使模块的导出等于给定类实例的导出。

因此,您可以通过将函数和值直接附加到模块来创建单例,但这有点像使用静态类创建单例:它非常不灵活,通常不是最佳实践。然而,大多数人确实将他们的模块视为“静态类”,因为正确构建依赖注入(inject)系统需要从一开始就进行大量思考,而这在 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();
});

关于javascript - 使用 RequireJS 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7708194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com