これは実際には依存性注入ではなく、サービスの場所です。他のモジュールは文字列「key」によって「クラス」を要求し、「サービスロケーター」(この場合はRequireJS)が接続されているインスタンスを取得します。それらを提供します。
依存性注入には、MyModel
コンストラクターを返すことが含まれます。つまりreturn MyModel
、中央の構成ルートで、のインスタンスを他のインスタンスに注入しMyModel
ます。これがどのように機能するかのサンプルをここにまとめました:https ://gist.github.com/1274607 (以下にも引用)
このようにして、コンポジションルートは、それを必要とするクラスごとに、単一のインスタンスを渡すMyModel
(つまり、シングルトンスコープにする)か、新しいインスタンスを渡すか(インスタンススコープにする)、またはその間の何かを決定します。そのロジックは、MyModelの定義にも、そのインスタンスを要求するクラスにも属していません。
(補足:私は使用していませんが、wire.jsはJavaScript用の本格的な依存性注入コンテナであり、かなりクールに見えます。)
RequireJSを使用するのと同じように使用することで、必ずしもRequireJSを悪用しているわけではありませんが、実行していることは少し回りくどいように見えます。つまり、クラスの新しいインスタンスを返すよりもクラスを宣言します。なぜ次のことをしないのですか?
define(function () {
var value = 10;
return {
doStuff: function () {
alert(value);
}
};
});
あなたが見逃しているかもしれないアナロジーは、モジュールは他のほとんどの言語の「名前空間」と同等ですが、関数と値を付加できる名前空間です。(JavaやC#よりもPythonに似ています。)これらはクラスと同等ではありませんが、ご覧のとおり、モジュールのエクスポートを特定のクラスインスタンスのエクスポートと等しくすることができます。
したがって、関数と値をモジュールに直接アタッチすることでシングルトンを作成できますが、これは静的クラスを使用してシングルトンを作成するようなものです。柔軟性が低く、一般的にベストプラクティスではありません。ただし、ほとんどの人はモジュールを「静的クラス」として扱います。依存性注入用のシステムを適切に設計するには、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();
});