2014-09-27 102 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范例。