SORU
12 ŞUBAT 2012, Pazar


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
13 ŞUBAT 2012, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • TV nEW

    TV nEW

    25 AĞUSTOS 2012