Dependency Injection (DI) パターンについて聞いたことがあるはずです。
バックエンドの人気のSpring フレームワークであっても、フロントエンドのトレンディな angular.js であっても、依存関係の注入はいたるところで見られます。
この用語は少しわかりにくいですが、中心となるアイデアは非常にシンプルです。 よく言われることわざを使うと、「風が欲しければ風が来るし、雨が欲しければ雨が降る」、言い換えれば、「食べ物を食べるときは、口を開けて、服があれば手を伸ばせるよ」。
私の説明を聞いてもまだ少し混乱しているかもしれませんが、最初に例を示します。 以下はいくつかのモジュールであり、「依存関係」とも呼ばれ、ハッシュオブジェクトに保存されます:
var deps = { 'firstDependency': function () {return 'this is firstDependency';}, 'secondDepency': function () {return 'this is secondDepency';}, };
新しいになりますOf:
var DI = function (dependency) { this.dependency = dependency; };
newでは、depsがパラメータとして渡されます。
さて、ここからが問題の核心です。何を書く必要がありますか:DI.prototype.inject = function (func) {......};
var di = new DI(deps); var myDependentFunc = di.inject(function (secondDepency, firstDependency) { firstDependency(); secondDepency(); }); myDependentFunc();
まず、
inject によって渡される匿名関数を観察してみましょう。これは要件を表しており、注入する必要がある場所です。
secondDepency, firstDependency
toString() 形式を取得します:
//第一步 DI.prototype.inject = function (func) { func.toString(); };
次に、文字列を分析し、すべての仮パラメータを見つけます:
//第二步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); };
String.prototype.trim=function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); }; var findArgs = function(funcStr){ var bracket1 = funcStr.indexOf("("); var bracket2 = funcStr.indexOf(")"); var argsStr = funcStr.slice(bracket1+1,bracket2); var args = argsStr.split(","); return args.map(function(e){ return e.trim(); }); };
realArgsは実際のパラメータリストを参照します:
//第三步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } //...... };
最後のステップは
injectionであり、匿名関数が実行されると、実際のパラメータリストはclosureを通じて取得されます。 、 func に注入されます。
DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } return function(){ return func.apply(null,realArgs); }; }
上記は JavaScript に関する興味深い質問です: 依存性注入の内容 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。