Scala 大型多模块播放框架应用
是否有大型多模块播放框架(Scala)应用程序的示例。例如,使用多个视觉主题并基于主题提供不同的内容。为此类应用程序组织代码的最佳方式是什么。我认为您的问题有两点:Scala 大型多模块播放框架应用,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,是否有大型多模块播放框架(Scala)应用程序的示例。例如,使用多个视觉主题并基于主题提供不同的内容。为此类应用程序组织代码的最佳方式是什么。我认为您的问题有两点: 如何将大型播放应用程序拆分为更小、更易于管理的模块 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据) 第一点很简单,尽管在线文档中没有明确(AFAIK)的记录。一出戏!模块的构建类似于常规播放应用程序,但没有任何配置文件。因此,基本上,删除任何应用程序的conf/文件夹,将其发布到您喜爱的存储库中,您就可以在另
- 如何将大型播放应用程序拆分为更小、更易于管理的模块
- 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
conf/
文件夹,将其发布到您喜爱的存储库中,您就可以在另一个应用程序/模块中将该模块用作依赖项了
第二点有点棘手。由于播放模板是静态编译的,在运行时更改视图是不受支持的,因此您必须提出自己的解决方案
第一种解决方案是使用不同的模板引擎,在运行时解释模板的模板引擎解释了如何在Play2.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()
}
这个解决方案要复杂一些,它要求每个主题有一个应用程序,这在某些上下文中可能是不可接受的,但它保留了编译时安全性,因此与前一个相比,它可能更可取
最后,您可以选择将系统拆分为两个不同的层:
- play应用程序中的业务层,带有简单的REST API
- 面向最终用户的渲染层,将使用业务API并负责特定于主题的渲染
您可以使用另一种技术来编写后一种技术,例如,一个简单的node.js服务器,它可以让您利用基于javascript的模板引擎。我认为您的问题有两个不同点:
- 如何将大型播放应用程序拆分为更小、更易于管理的模块
- 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
conf/
文件夹,将其发布到您喜爱的存储库中,您就可以在另一个应用程序/模块中将该模块用作依赖项了
第二点有点棘手。由于播放模板是静态编译的,在运行时更改视图是不受支持的,因此您必须提出自己的解决方案
第一种解决方案是使用不同的模板引擎,在运行时解释模板的模板引擎解释了如何在Play2.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()
}
这个解决方案要复杂一些,它要求每个主题有一个应用程序,这在某些上下文中可能是不可接受的,但它保留了编译时安全性,因此与前一个相比,它可能更可取
最后,您可以选择将系统拆分为两个不同的层:
- play应用程序中的业务层,带有简单的REST API
- 面向最终用户的渲染层,将使用业务API并负责特定于主题的渲染
您可以使用另一种技术来编写后一种技术,例如,一个简单的node.js服务器,它可以让您利用基于javascript的模板引擎。我认为您的问题有两个不同点:
- 如何将大型播放应用程序拆分为更小、更易于管理的模块
- 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
conf/
文件夹,将其发布到您喜爱的存储库中,您就可以在另一个应用程序/模块中将该模块用作依赖项了
第二点有点棘手。由于播放模板是静态编译的,在运行时更改视图是不受支持的,因此您必须提出自己的解决方案
第一