2014-04-14 64 views
0

是否有任何大型多模塊播放框架(Scala)應用程序的示例。例如,使用多個視覺主題並根據主題提供不同的內容。爲這些應用程序組織代碼的最佳方式是什麼?大型多模塊播放框架應用程序

+0

你確定你的意思是不同的主題?通常主題的目標是讓它們與內容分離。 – Peanut

回答

2

我覺得有你的問題的兩個不同點:

  • 如何拆分大型遊樂應用到更小,更易於管理的模塊?
  • 如何爲同一動作動態選擇不同的視圖(即有多個主題呈現相同的數據)?

第一點很簡單,雖然在聯機文檔中記錄不清楚(AFAIK)。一場戲!模塊像普通的播放應用程序一樣構建,但沒有任何配置文件。所以基本上,刪除任何應用程序的conf/文件夾,將其發佈到您喜歡的存儲庫中,然後您就可以將該模塊用作另一個應用程序/模塊中的依賴項。

第二點是有點棘手。由於播放模板是靜態編譯的,因此在運行時更改視圖是不受支持的,您必須提出自己的解決方案。

第一個解決方案是使用一個不同的模板引擎,一個在運行時解釋模板的解釋引擎this blog post解釋瞭如何在play 2.X應用程序中使用該scalate模板引擎。

另一種解決方案是使用運行時反射在運行時選擇正確的模板,但代價是失去了一些編譯時間保護(如果所需模板不存在,則會產生運行時錯誤,並且而不是像普通應用程序那樣的編譯時錯誤)。

第三種解決方案是從你的控制器抽象模板和路由(使它們成爲特徵或抽象類)在父模塊中,然後爲每個不同的主題創建一個子應用程序,每個子應用程序只需要實現摘要控制器通過提供所需的模板和路線:

// in the parent module 
trait AbsCtrl extends Controller { 
    val indexTemplate : (Foo, Bar) => Html // a template is like a function 
             // from some models to Html 
    val errorRoute : Call 

    def index() = Action { 
    request => 
     val foo = Foo() 
     val bar = Bar() 
     if(someCondition) Ok(indexTemplate(foo, bar)) 
     else Redirect(errorRoute) 
    } 
} 

// in the child module 
object Ctrl extends AbsCtrl { 
    // assuming you have a scala template named index that take the right arguments 
    override val indexTemplate = views.html.index.render 
    override val errorRoute = routes.Application.error() 
} 

該溶液是有點更復雜,它需要具有每主題一個應用程序,它可能無法在某些情況下可以接受的,但它保留了編譯時間的安全性,所以它可能比前一個更好。

最後,你可以選擇你的系統在兩個不同的層分裂:

  • 業務層在您的播放應用,用一個簡單的REST API
  • 渲染層,面向最終用戶,即「將使用的業務API和照顧的具體主題渲染

您可以使用另一種技術來編寫一個後,例如,一個簡單的node.js服務器,可以讓你利用一個JavaScript基於模板發動機。

+0

我們在當前自行開發的應用程序中具有此功能。我會*愛*把所有的代碼翻出來,進入更像遊戲這樣的「主流」。我想知道是否有scala。元的方式來爲各種網站做代碼生成,並允許domain1.com有一個特定的視圖/模板覆蓋base.com的配置,並強制兒童/父母模板的簽名是類型安全的/等等。這個評論問題已經過了幾年的評論,你有沒有看到更好的解決方案? – ericpeters