[解決済み】NodeJSで依存性注入は必要ですか、それともどう対処すれば・・・?
質問
現在、nodejsでいくつかの実験的なプロジェクトを作成しています。私はSpringで多くのJava EEウェブアプリケーションをプログラムしたことがあり、そこでの依存性注入の容易さに感謝しています。
nodeで依存性注入を行うにはどうすればよいのでしょうか?あるいは、必要なのでしょうか?プログラミングスタイルが違うので、置き換えられるコンセプトがあるのでしょうか?
これまでのところ、データベース接続オブジェクトを共有するような簡単な話なのですが、納得のいく解決策は見つかっていません。
どのように解決するのですか?
要するに、C#/Javaのように依存性注入コンテナやサービスロケータは必要ないのです。Node.jsでは、依存性注入コンテナやサービスロケータは必要ありません。
module pattern
そのため、コンストラクタやプロパティのインジェクションを行う必要はありません。ただし、それでも可能です。
JSの素晴らしいところは、欲しいものを実現するために、あらゆるものを修正できることです。これはテストするときに便利です。
見よ、私の非常にいい加減な作為的な例を。
MyClass.js
:
var fs = require('fs');
MyClass.prototype.errorFileExists = function(dir) {
var dirsOrFiles = fs.readdirSync(dir);
for (var d of dirsOrFiles) {
if (d === 'error.txt') return true;
}
return false;
};
MyClass.test.js
:
describe('MyClass', function(){
it('should return an error if error.txt is found in the directory', function(done){
var mc = new MyClass();
assert(mc.errorFileExists('/tmp/mydir')); //true
});
});
このように
MyClass
は
fs
モジュールですか?ShatyemShekhar が言ったように、確かに他の言語と同様にコンストラクタやプロパティインジェクションを行うことができます。しかし、Javascriptでは必要ないのです。
この場合、2つのことを行うことができます。
をスタブすることができます。
fs.readdirSync
メソッドを呼び出すときに、まったく別のモジュールを返すこともできます。
require
.
方法1.
var oldmethod = fs.readdirSync;
fs.readdirSync = function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
*** PERFORM TEST ***
*** RESTORE METHOD AFTER TEST ****
fs.readddirSync = oldmethod;
方法2:
var oldrequire = require
require = function(module) {
if (module === 'fs') {
return {
readdirSync: function(dir) {
return ['somefile.txt', 'error.txt', 'anotherfile.txt'];
};
};
} else
return oldrequire(module);
}
重要なのは、Node.jsとJavascriptのパワーを活用することです。注:私はCoffeeScriptの人間なので、JSの構文がどこかで間違っているかもしれません。また、これがベストな方法だとは言いませんが、一つの方法です。Javascriptの達人なら、他の解決策を教えてくれるかもしれません。
更新しました。
データベース接続に関する具体的な質問については、これで解決するはずです。私なら、データベース接続のロジックをカプセル化するために別のモジュールを作成します。このようなものです。
MyDbConnection.js
: (必ず)もっと良い名前を選んでください
var db = require('whichever_db_vendor_i_use');
module.exports.fetchConnection() = function() {
//logic to test connection
//do I want to connection pool?
//do I need only one connection throughout the lifecyle of my application?
return db.createConnection(port, host, databasename); //<--- values typically from a config file
}
そして、データベース接続を必要とするすべてのモジュールは、あなたの
MyDbConnection
モジュールになります。
SuperCoolWebApp.js
:
var dbCon = require('./lib/mydbconnection'); //wherever the file is stored
//now do something with the connection
var connection = dbCon.fetchConnection(); //mydbconnection.js is responsible for pooling, reusing, whatever your app use case is
//come TEST time of SuperCoolWebApp, you can set the require or return whatever you want, or, like I said, use an actual connection to a TEST database.
この例をそのまま踏襲しないでください。この例では
module
パターンを使って依存関係を管理します。これが少しでも役に立てばいいのですが。
関連
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】ENOENT, そのようなファイルまたはディレクトリがありません。
-
[解決済み] Heroku "状態が起動から停止に変更されました SIGTERMで全プロセスを停止"
-
[解決済み] TypeErrorです。リクエストパスにエスケープされていない文字が含まれています。
-
[解決済み] Yarn にパッケージを強制的に再インストールさせるにはどうしたらいいですか?
-
[解決済み] package.jsonの各依存関係を最新バージョンに更新する方法は?
-
[解決済み] Node.jsで現在のスクリプトのパスを取得するにはどうしたらいいですか?
-
[解決済み] Inversion of ControlとDependency Injectionの比較
-
[解決済み] なぜ依存性注入を使用するのですか?
-
[解決済み] Dependency Injectionのコンストラクタの狂気を回避する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】Mongooseで配列の値を更新する方法
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] ReferenceError: describe は定義されていません NodeJs
-
[解決済み] TypeErrorです。リクエストパスにエスケープされていない文字が含まれています。
-
[解決済み] Json Web Token verify() return jwt malformed
-
[解決済み] NPMが同じエラーで固まる EISDIR: ディレクトリに対する不正な操作、エラーで読み込み (ネイティブ)