Nasıl başa NodeJS ya ...bağımlılık enjeksiyon ihtiyacım var mı?
Ben şu anda nodejs ile bazı deneysel projeler oluşturmak. Bahar ile Java EE web uygulamaları çok programlı var ve orada bağımlılık enjeksiyon kolaylığı takdir.
Şimdi merak ediyorum: Nasıl düğüm ile bağımlılık enjeksiyon yapacağım? Veya: bile gerek yok? Programlama stili farklı olduğu için yerine bir kavram var mı?
Veritabanı bağlantısı nesnesi paylaşımı gibi basit şeyler hakkında konuşurken, şimdiye kadar olduğum, ama beni tatmin eden bir çözüm bulamadım.
CEVAP
Kısacası, bir bağımlılık enjeksiyon C senin gibi kap veya hizmet ile ilgili.#/Java gerek yok. Node.js, module pattern
, güçlendirir beri gerekli yapıcı veya özellik enjeksiyon gerçekleştirmek için değil. Hala rağmen.
JS hakkında çok şey hakkında istediğini elde etmek için her şeyi değiştirebilirsiniz. Bu test için geldiğinde kullanışlı oluyor.
Çok saçma yapmacık benim örnek işte.
MyClass.js
:
var fs = require('fs');
MyClass.prototype.errorFileExists = function(dir) {
var dirsOrFiles = fs.readdirSync(dir);
for (var d in 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
modüle bağlıdır nasıl fark ettin mi? @ShatyemShekhar belirtildiği gibi, gerçekten de diğer diller gibi yapıcı veya özellik enjeksiyon yapabilirsiniz. Ama Javascript gerekli değil.
Bu durumda iki şey yapabilirsiniz.
fs.readdirSync
yöntemi, saplama veya require
çağırdığınızda tamamen farklı bir modül dönebilirsiniz.
Yöntem 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;
Yöntem 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);
}
Anahtar kaldıraç node.js ve Javascript gücü. Not, CoffeeScript bir adamım, JS benim sözdizimi yanlış bir yerde olabilir. Ayrıca, bu en iyi yol olduğunu söylemiyorum, ama bir yoldur. Javascript uzmanları başka çözümler söylemek mümkün olabilir.
Güncelleme:
Bu soru belirli veritabanı bağlantıları ile ilgili olarak ele almalıdır. Veritabanı bağlantısı mantığını saklanması için ayrı bir modül oluşturmak istiyorum. Şöyle bir şey:
MyDbConnection.js
: () daha iyi bir ad seçtiğinizden emin olun
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
}
Sonra, bir veritabanı bağlantısı gereken herhangi bir modül o zaman sadece MyDbConnection
modül yer alacak.
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.
Bu örnek, kelimesi kelimesine takip etmeyin. Sen kaldıraç bağımlılıkları yönetmek için module
desen o iletişim kurmaya çalışan topal bir örnek. Umarım bu biraz daha yardımcı olur.
Nasıl Bağımlılık yapıcı Enjeksiyon del...
Nasıl Bağımlılık Enjeksiyon ile log4ne...
Nasıl hardcoding olmadan Kek kalıbı il...
Nasıl "Bağımlılık Enjeksiyon"...
Nasıl bir scala bağımlılık enjeksiyon ...