NodeJS で依存性注入は必要ですか、それともどう対処すればいいですか? 質問する

NodeJS で依存性注入は必要ですか、それともどう対処すればいいですか? 質問する

現在、Node.js を使用していくつかの実験的なプロジェクトを作成しています。Spring を使用して多くの Java EE Web アプリケーションをプログラミングしており、依存性注入の容易さを高く評価しています。

今、私は興味があります。ノードで依存性注入を行うにはどうすればよいのでしょうか。あるいは、依存性注入は必要なのでしょうか。プログラミング スタイルが異なるため、代替の概念はあるのでしょうか。

これまでのところ、データベース接続オブジェクトの共有など、単純なことについて話していますが、満足できる解決策は見つかっていません。

ベストアンサー1

つまり、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 構文が間違っている可能性があります。また、これが最善の方法だと言っているわけではありませんが、1 つの方法です。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。これが少しでもお役に立てば幸いです。

おすすめ記事