2015-11-20 11 views
7

Bazı soyutlamalara ihtiyacım olan bir uygulama geliştiriyorum.Mongoose kullanarak soyutlama sınıfı

Orada demek istediğim, somut sınıflarımın içinde bir sözleşme oluşturmak gibi bir arayüz davranışını “simüle etmek” istiyorum.

Aslında Kullanıcılar ile uğraşan, ben uygulanan sözleşme ile bir UserMongoRepository sınıfını yaşıyorum:

  • getAll() vaadi
  • GetById (id) tarafından kullanıcıların tam listesini döndürür ilgili kullanıcıyı döndürür vs vaat
  • kullanıcıyı kaydeder (kullanıcı) tasarrufu vaat
  • ...

tarafından aynı bana sahip UserMysqlRepository içinde uygulanan thods (bir değişiklik gerektiğinde davranışı değiştirmeme izin veriyor.

Sorun

Sorunum ama daha aktif bir plak gibi, bir datamapper gibi hareket etmez Gelincik uğraşıyorum olmasıdır.

O save (kullanıcının) benim uygulaması aşağıdaki gibi biraz garip olurdu anlamına gelir:

save(user){ 
    let mongooseUser = this.convert(user); 
    return user.save(); 
    } 

dönüştürme yöntemi bana belirli Gelincik modeline standart Modeli geçiş sağlar. Yine, tüm uygulama veri erişimimi yeniden yazmak zorunda kalmama ve yeniden soyutlamaya izin verir. Standart bir şekilde

import MongooseUser from '../../auth/mongooseModel/MongooseUser'; 
/** 
* UserMongoRepositoryclass 
*/ 
export default class UserMongoRepository{ 

    /** 
    * Create an UserMongoRepository 
    */ 
    constructor(){ 

    } 

    /** 
    * Convert a User to a MongooseUser 
    */ 
    convert(user){ 
    return new MongooseUser({email:user.mail,password:user.password,firstname:user.firstName, lastname:user.lastName}); 
    } 

    findById(id){ 
    return MongooseUser.find({id:id}); 
    } 

    save(user){ 
    return user.save(); 
    } 

} 

, benim yapıcı içinde benim DAO enjekte ederdi ve onu alay etmek mümkün: Ben birimine denemek benim tam sınıfını test ederken

Gerçek bir sorundur.

Firavun durumunda, bu biraz rahatsız edici, çünkü işi yapan eleman bir örneklenmiş nesne (alay edebilmem için) değil, ancak belgenin en üstünde içe aktarılan bir sınıf tanımıdır.

Çözümler

Ben yapıcı içinde bir parametre olarak MongooseUser sınıf tanımını geçerlerse?

Ben dönüştürme yönteminin içine bu kodu olacak ima:

let user = new this.MongooseUser({}) 

veri mapper şekilde soyut firavunfaresi davranışına, iyi bir fikrin var mı? Söylediğin olsa

bu benim duygusu, NodeJS ile en gelişmiş birinde, var, başka modülü kullanmak istemiyorum ...

+0

sağ – CreasolDev

+0

Şimdilik, mongoose kullandığınız açıklığa kavuşturmak için, Kullanıyorum, evet – mfrachet

+0

Atm'a gitmeliyim, ama size yakında bir cevap vereceğim;) – CreasolDev

cevap

0

Ben, import sözdizimi (ne de EMCASCRIPT-6) aşina değilim node.js kullanıyorsunuz, bu yüzden proxquire paketini kullanmanızı tavsiye ederim. Buradaki fikir, paketin, paketin kullanacağı gereklilikleri yerine getirirken, harici bir paket gerektirmesine izin vermesidir.Eğer pakette bunu tanımlandığı gibi hala MongooseUser kullanırken kendi mongoose uygulaması kullanmasına izin vereceğini

proxyquire('../my/class/that/uses/mongoose', { 
    mongoose: MyTestMongooseImplementation 
}) 

: sizin durumda Yani, böyle bir şey yapabilirdi. Alternatif olarak, sadece gereksinimleri stubbing olan dosyaya MongooseUser sınıf (yol göreli geçersiz olabilir:

proxyquire('/path/to/UserMongooseRepository', { 
    '../../auth/mongooseModel/MongooseUser': MyTestMongooseUser 
}) 

Dokümantasyon:? https://www.npmjs.com/package/proxyquire