我需要制作一个可以包含对象列表的 Web 服务。一个列表可以包含多种类型的对象。例如,在这里,我有一个媒体项目库。每个项目可以是链接或视频,每个项目都有自己的元数据。
我想用 Lift web 框架来做这件事,因为我需要一些可以编译成 WAR 的东西,而且我以前用过 Lift。
我认为使用 MongoDB 进行这种存储会起作用,因为根据定义,它应该能够处理异构项目的集合。
我可以定义要存储在 Lift 记录中的 BSON 对象类型,但我似乎无法坚持在一个记录/集合中只创建一种类型的对象。理想情况下,我希望我的图书馆中的每个“事物”(因为没有更好的词)都是视频或链接。例如:
[
{
"type" : "Video",
"title" : "Story",
"videoID" : "123ab4",
"description": "Feature-length epic",
"time" : 12.6
},
{
"type" : "link",
"url" : "http://www.google.com",
"title": "Search for stuff"
}
]
我应该能够使用正确的继承类型来做到这一点,但是所有记录对象的父母都从对象继承的方式让我失望。我可以让它工作吗?有一个Lift可以使用的不同东西的集合吗?
这是我到目前为止所拥有的。我还没有测试过它,但即使它有效,它的作用也不是我想要的。
import net.liftweb.record._
import net.liftweb.record.field._
import net.liftweb.mongodb._
import net.liftweb.mongodb.record._
import net.liftweb.mongodb.record.field._
class VideoShelf private () extends BsonRecord[VideoShelf] {
def meta = VideoShelf
object title extends StringField (this, 256)
object videoID extends StringField (this, 32 )
object description extends StringField (this, 256)
object time extends DecimalField(this, 0 )
}
object VideoShelf extends VideoShelf with BsonMetaRecord[VideoShelf]
class LinkShelf private () extends BsonRecord[LinkShelf] {
def meta = LinkShelf
object url extends StringField(this, 128)
object title extends StringField(this, 256)
}
object LinkShelf extends LinkShelf with BsonMetaRecord[LinkShelf]
class MediaLibrary private () extends MongoRecord[MediaLibrary] with ObjectIdPk[MediaLibrary] {
def meta = MediaLibrary
///////////////////////////////////////
///////////////////////////////////////
// What I want is this record type to
// contain either of these:
///////////////////////////////////////
object videoshelf extends BsonRecordField(this, VideoShelf)
object linkshelf extends BsonRecordField(this, LinkShelf )
}
object MediaLibrary extends MediaLibrary with MongoMetaRecord[MediaLibrary]
我怎样才能得到这个?