2014-09-27 99 views
3

我創建了一個Express.js應用程序,我在其中使用MVC模式和Mongoose將文檔映射到MongoDB數據庫。我已經爲模型創建了一個文件夾,我想從(JavaScript的版本)抽象類派生所有的東西來獲得更好的代碼組織。使用Mongoose&Express.js的MVC OOP

我很困惑最好的辦法是組織抽象類,並設置每個模型實例應該是的默認值。例如,一個方法是使用貓鼬架構進行抽象類,然後用貓鼬車型爲模型本身:

Feline.js:

var mongoose = require('mongoose'); 

var Feline = mongoose.Schema({ 
    size: 'Number' 
}); 

Feline.methods.getSize = function() { 
    return this.size; 
} 

module.exports = Feline; 

HouseCat.js:

var mongoose = require('mongoose') 
, FelineSchema = require('./Feline.js'); 

var HouseCatModel = mongoose.model('HouseCat', FelineSchema) 
, HouseCat = new HouseCatModel({ 
    size: 1 //Domesticated cats are small 
}); 

module.exports = HouseCat; 

這個設計有幾個問題。首先,我認爲必須有一種更好的方法來爲每個模型設置特定的屬性,而不必在每次客戶端想要創建模型類型的新實例時都實例化一個新的模型對象。另一方面,使用這種方案,必須在每個模型文件中都使用Mongoose,並且該代碼是爲使用貓鼬而定製的,這意味着如果我們將來要做到這一點,將很難切換到另一個ODM。

有沒有更好的編碼方式?是否有任何設計模式很容易在Node中實現,以便於更改ODM?

回答

1

由於貓鼬是特定於mongodb的,因此抽象它的行爲將是一項艱鉅的任務。

最簡單的方法是爲所有ODM設置接口,並使用adapter pattern,其中貓鼬是「適配器」。然後,您可以使用提供一些依賴注入的模塊來替換使用的ODM。

由於這是一個很長的任務,我不能給你一些代碼。而且,在javascript中實現這種類型的東西可能會很痛苦,因爲它本身不提供強大的OOP。不過,我建議你看一下frameworks,它可以幫助你做到這一點,比如Danf,它爲接口,類,繼承和強大的依賴注入提供了強大的OOP範例。