2013-04-10 50 views
2

我需要開發REST API來向數據庫和一些業務邏輯公開CRUD操作。我更喜歡這個模塊是獨立的,快速的,可擴展的和靈活的(沒有不必要的模塊提供我不需要的功能,以降低維護成本)。可擴展且快速的REST API來公開ORM方法

發展喜好:
- 框架/語言,做類型檢查
- 具有良好的ORM映射
- 具有良好的TDD/BDD支持
- 功能性的語言

我想知道,如果一些像squeryl和藍眼睛或squeryl和spary的scala模塊的組合可以做到這一點,但它不一定是scala。有任何想法嗎?

+0

我會說[Play框架](http://www.playframework.com/)使用Scala。 – maba 2013-04-10 14:24:47

+0

ORM是一種幾乎不可能維護的錯覺。算了吧!關係數據是關係數據。對象模型是對象模型。 – 2013-04-10 16:10:07

回答

1

你描述的是肯定可能的。我對Spray或BlueEyes沒有任何經驗,但我肯定使用了Squeryl + Play,並且可以做你想做的事。它可能提供了你不需要的模塊,但是如果你不使用它們,這些模塊不應該對維護成本做出貢獻。

一個大問題是,大多數(如果不是全部)Scala框架是圍繞異步編程模型設計的(實際上是大多數其他高可伸縮性框架,如Node.js)。另一方面,ORM通常是圍繞同步編程模型構建的。然而,你可以用一些膠水代碼,一些防禦性編碼和一些小心的調整(這就是我們所做的)來解決這個不匹配問題。

更徹底的選擇是將ORM換成像MongoDB或CouchDB這樣的文檔數據庫(文檔數據庫通常具有合理的異步驅動程序)。

+0

謝謝。由於軟件更新和錯誤修復,我們不使用的模塊確實會影響性能和維護成本。對於MVC的「視圖」部分尤其如此,這部分往往會有超時變化。但是,如果沒有更好的選擇,這就是我要做的。 – 2013-04-10 15:35:44

+0

還有一件事...雖然我說ORM,但我的意思是DB實體(關係或不關係)到對象映射。感謝您指出了這一點。話雖如此,我也相信它不再是SQL vs noSQL了。雖然我們認爲我們還沒有足夠的工具來處理它,但Polygot持久性將成爲新的常態。 – 2013-04-10 15:45:17

0

我覺得Lift web framework是由於以下原因很可能成爲候選人:

道具

  1. 高度模塊化。

    雖然Lift是一個完整的Web應用程序框架,但它高度模塊化。它有它自己的ORM庫,但是如果你不喜歡它,只是不要將它包含在你的庫依賴項中,而應該使用Squeryl之類的其他庫。類似的,它具有類型安全的JSON庫,但它也是可選的。

  2. 這只是一個普通的Java Web容器過濾器。

    這意味着你可以與基於Java的Web容器中運行其他的框架使用它,並指定只有特定的URL會去提起,和其他網址只會給你的舊框架,或者只是一個純粹的JSP。

  3. 這是類型安全和功能。

    在電梯大部分操作是強類型的類型安全的,例如,你可以在SessionVar會話變量存儲沒有失去它的類型信息。

    Lift還利用了許多函數式編程技術,如局部函數,模式匹配和基於轉換的pure xHTML/HTML5 template system,而不是將嵌入式scala代碼嵌入到模板中以生成動態內容。

  4. 兩個狀態和無狀態超級簡單的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和函數式編程特性,有時候學習它會很不容易。

1

對於網絡前端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() 
+0

謝謝。你能回答這裏發佈的問題嗎? http://stackoverflow.com/questions/15958677/latest-scala-version-sorm-supports – 2013-04-11 20:56:00