DIのトピックに関するいくつかの記事を読んだ後、Node.jsで使用したいと思いました。 短い検索の後、このためのモジュールはそれほど多くないことがわかりました。最も興味深いのはAngularのdi.jsですが、私には合わなかったので、私は私のものを書くことにしました。
なぜdi.jsではありませんか?
- ES6を使用して記述されています。 ES5での予備コンパイルが必要であり、デコレータを使用するため、ES5でコードをコンパイルする必要があります
- 長い間サポートされていません
- 古いコンパイラ(es6-shim)を使用します
- 同じクラスの複数のインスタンスを作成する機能はありません
実装を作成します
モジュールを記述する上で最も興味深いことは、コンストラクターに引数を動的に渡すタスクです。
最も明らかな解決策はapplyを使用することですが、コンストラクタではなくメソッドと対話するため、これは機能しません。
この目的のために、 スプレッド演算子を使用できます:
class Test { constructor(a, b) { } } let args = [1, 2] let test = new Test(...args)
それ以外の場合、実装はかなり退屈で、興味深いものは含まれていません。
モジュールを使用します
構成ファイルを優先して、di.jsデコレーターを放棄することにしました。 コンピューターのアーキテクチャーを記述し、構成でクラス、パス、引数を記述する必要があるとします。
{ "Computer": { "class": "./Computer.js", // "args": ["RAM", "HDD", "CPU", "GPU"] // }, "RAM": { "class": "./RAM.js", "args": [] }, "HDD": { "class": "./HDD.js", "args": [] }, "CPU": { "class": "./CPU.js", "args": ["RAM"] }, "GPU": { "class": "./GPU.js", "args": [] } }
Computerクラスは、他のすべての人と同様に、非常に単純です。
'use strict' class Computer { constructor(ram, hdd, cpu, gpu) { this._cpu = cpu this._gpu = gpu this._hdd = hdd this._ram = ram } } module.exports = Computer
アプリケーションのエントリポイントで、モジュールを使用します。
const Injector = require('razr')(__dirname, './path/to/your/config.json') // const computer = Injector.get('Computer') // Computer
構成ファイルで、アプリケーションのエントリポイントに関連するクラスへのパスを指定する必要があることに注意してください。
以上です。 それを読んだすべての人に感謝します。 また、GitHubへのリンク-https ://github.com/Naltox/razrおよびNPM- http://npmjs.com/package/razr