我需要開發REST API來向數據庫和一些業務邏輯公開CRUD操作。我更喜歡這個模塊是獨立的,快速的,可擴展的和靈活的(沒有不必要的模塊提供我不需要的功能,以降低維護成本)。可擴展且快速的REST API來公開ORM方法
發展喜好:
- 框架/語言,做類型檢查
- 具有良好的ORM映射
- 具有良好的TDD/BDD支持
- 功能性的語言
我想知道,如果一些像squeryl和藍眼睛或squeryl和spary的scala模塊的組合可以做到這一點,但它不一定是scala。有任何想法嗎?
我需要開發REST API來向數據庫和一些業務邏輯公開CRUD操作。我更喜歡這個模塊是獨立的,快速的,可擴展的和靈活的(沒有不必要的模塊提供我不需要的功能,以降低維護成本)。可擴展且快速的REST API來公開ORM方法
發展喜好:
- 框架/語言,做類型檢查
- 具有良好的ORM映射
- 具有良好的TDD/BDD支持
- 功能性的語言
我想知道,如果一些像squeryl和藍眼睛或squeryl和spary的scala模塊的組合可以做到這一點,但它不一定是scala。有任何想法嗎?
你描述的是肯定可能的。我對Spray或BlueEyes沒有任何經驗,但我肯定使用了Squeryl + Play,並且可以做你想做的事。它可能提供了你不需要的模塊,但是如果你不使用它們,這些模塊不應該對維護成本做出貢獻。
一個大問題是,大多數(如果不是全部)Scala框架是圍繞異步編程模型設計的(實際上是大多數其他高可伸縮性框架,如Node.js)。另一方面,ORM通常是圍繞同步編程模型構建的。然而,你可以用一些膠水代碼,一些防禦性編碼和一些小心的調整(這就是我們所做的)來解決這個不匹配問題。
更徹底的選擇是將ORM換成像MongoDB或CouchDB這樣的文檔數據庫(文檔數據庫通常具有合理的異步驅動程序)。
謝謝。由於軟件更新和錯誤修復,我們不使用的模塊確實會影響性能和維護成本。對於MVC的「視圖」部分尤其如此,這部分往往會有超時變化。但是,如果沒有更好的選擇,這就是我要做的。 – 2013-04-10 15:35:44
還有一件事...雖然我說ORM,但我的意思是DB實體(關係或不關係)到對象映射。感謝您指出了這一點。話雖如此,我也相信它不再是SQL vs noSQL了。雖然我們認爲我們還沒有足夠的工具來處理它,但Polygot持久性將成爲新的常態。 – 2013-04-10 15:45:17
我覺得Lift web framework是由於以下原因很可能成爲候選人:
高度模塊化。
雖然Lift是一個完整的Web應用程序框架,但它高度模塊化。它有它自己的ORM庫,但是如果你不喜歡它,只是不要將它包含在你的庫依賴項中,而應該使用Squeryl之類的其他庫。類似的,它具有類型安全的JSON庫,但它也是可選的。
這只是一個普通的Java Web容器過濾器。
這意味着你可以與基於Java的Web容器中運行其他的框架使用它,並指定只有特定的URL會去提起,和其他網址只會給你的舊框架,或者只是一個純粹的JSP。
這是類型安全和功能。
在電梯大部分操作是強類型的類型安全的,例如,你可以在SessionVar會話變量存儲沒有失去它的類型信息。
Lift還利用了許多函數式編程技術,如局部函數,模式匹配和基於轉換的pure xHTML/HTML5 template system,而不是將嵌入式scala代碼嵌入到模板中以生成動態內容。
兩個狀態和無狀態超級簡單的REST支持。
創建一個REST API in Lift is super easy,它有一個非常好的和簡單的DSL。它支持有狀態和無狀態,有時以有狀態的方式做事更容易,Lift給你。有狀態和無狀態都使用相同的REST DSL,您只需告訴Lift您想要的風格,並且它會爲您處理所有事情(初始化會話...等)。
例如,以下代碼顯示如何創建支持XML和JSON的REST API來獲取和發佈博客文章。
object BlogAPI extends RestHelper {
def getPostXML(postID: String) = <article>{postID}</article>
def getPostJSON(postID: String): JValue = ("postID" -> 1)
def addPostJSON(jsonBody: JValue) = {
// Extract from jsonBody and add post to DB
new OkResponse()
}
serve {
// Read blog post API in XML and JSON
case "api" :: "blog" :: "post" :: postID :: Nil XmlGet request => getPostXML(postID)
case "api" :: "blog" :: "post" :: postID :: Nil JsonGet request => getPostJSON(postID)
// Post blog post API in JSON
case "api" :: "blog" :: "post" :: Nil JsonPost ((jsonBody, req)) => addPostJSON(jsonBody)
}
}
這幾乎是您在Lift中創建REST API所需的全部功能。它會將URL GET /api/blog/1.xml
與XML響應匹配,並且GET /api/blog/1.json
將返回JSON響應。
電梯的最缺點是,文件小於一些其他的框架,你可以找到一些網站的信息是過時的。
而且由於Lift使用了許多先進的Scala特性和一些函數式編程風格,因此如果您不熟悉Scala和函數式編程特性,有時候學習它會很不容易。
對於網絡前端Play Framework已成爲最近的默認選擇。
對於ORM我建議SORM Framework:
以下是它可以做的一個完整的例子。不需要額外的代碼。
// Declare a model:
case class Artist(name : String, genres : Set[Genre])
case class Genre(name : String)
// Initialize SORM, automatically generating schema:
import sorm._
object Db extends Instance(
entities = Set(Entity[Artist](), Entity[Genre]()),
url = "jdbc:h2:mem:test"
)
// Store values in the db:
val metal = Db.save(Genre("Metal"))
val rock = Db.save(Genre("Rock"))
Db.save(Artist("Metallica", Set(metal, rock)))
Db.save(Artist("Dire Straits", Set(rock)))
// Retrieve values from the db:
// Option[Artist with Persisted]:
val metallica = Db.query[Artist].whereEqual("name", "Metallica").fetchOne()
// Stream[Artist with Persisted]:
val rockArtists = Db.query[Artist].whereEqual("genres.item.name", "Rock").fetch()
謝謝。你能回答這裏發佈的問題嗎? http://stackoverflow.com/questions/15958677/latest-scala-version-sorm-supports – 2013-04-11 20:56:00
我會說[Play框架](http://www.playframework.com/)使用Scala。 – maba 2013-04-10 14:24:47
ORM是一種幾乎不可能維護的錯覺。算了吧!關係數據是關係數據。對象模型是對象模型。 – 2013-04-10 16:10:07