2014-04-14 34 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