Schema.org是標記詞彙表(針對網頁),並根據屬性(無方法)定義了多個類型。我目前正試圖在Scala中將該模式的部分建模爲內部模型類,以便與面向文檔的數據庫(MongoDB)和Web框架一起使用。如何在Scala中模擬schema.org?
如可在LocalBusiness的定義可以看出,使用schema.org多重繼承也包括從「放置」類型屬性。所以我的問題是:你將如何在Scala中建模這樣的模式?
我想出了兩種解決方案爲止。第一個使用常規類來建模單個繼承樹,並使用特徵來混合這些附加屬性。
trait ThingA {
var name: String = ""
var url: String = ""
}
trait OrganizationA {
var email: String = ""
}
trait PlaceA {
var x: String = ""
var y: String = ""
}
trait LocalBusinessA {
var priceRange: String = ""
}
class OrganizationClassA extends ThingA with OrganizationA {}
class LocalBusinessClassA extends OrganizationClassA with PlaceA with LocalBusinessA {}
第二個版本嘗試使用案例類。但是,由於案例類繼承已被棄用,所以我無法輕鬆地對主要層次結構進行建模。
trait ThingB {
val name: String
}
trait OrganizationB {
val email: String
}
trait PlaceB {
val x: String
val y: String
}
trait LocalBusinessB {
val priceRange: String
}
case class OrganizationClassB(val name: String, val email: String) extends ThingB with OrganizationB
case class LocalBusinessClassB(val name: String, val email: String, val x: String, val y: String, val priceRange: String) extends ThingB with OrganizationB with PlaceB with LocalBusinessB
有沒有更好的方法來建模?我可以使用類似的組成
case class LocalBusinessClassC(val thing:ThingClass, val place: PlaceClass, ...)
但隨後的過程中,不能當「地方」預計,當我嘗試呈現在谷歌地圖中使用的東西LocalBusiness,例如。
非常感謝您的回答!是的,你是對的,使用選項建模所有模型更有意義。但是,我不太確定我該如何動態創建匿名內部類。如果我需要爲數據庫中的每個對象創建一個這樣的類(這些對象不過是鍵值映射),我認爲它不會很好地伸縮。 – IRQ
我添加了一個如何使用[存儲庫模式](http://martinfowler.com/eaaCatalog/repository.html)將這些對象映射到數據庫的示例。 – leedm777