Scala 大型多模块播放框架应用

Scala 大型多模块播放框架应用,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,是否有大型多模块播放框架(Scala)应用程序的示例。例如,使用多个视觉主题并基于主题提供不同的内容。为此类应用程序组织代码的最佳方式是什么。我认为您的问题有两点: 如何将大型播放应用程序拆分为更小、更易于管理的模块 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据) 第一点很简单,尽管在线文档中没有明确(AFAIK)的记录。一出戏!模块的构建类似于常规播放应用程序,但没有任何配置文件。因此,基本上,删除任何应用程序的conf/文件夹,将其发布到您喜爱的存储库中,您就可以在另

是否有大型多模块播放框架(Scala)应用程序的示例。例如,使用多个视觉主题并基于主题提供不同的内容。为此类应用程序组织代码的最佳方式是什么。

我认为您的问题有两点:

  • 如何将大型播放应用程序拆分为更小、更易于管理的模块
  • 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
第一点很简单,尽管在线文档中没有明确(AFAIK)的记录。一出戏!模块的构建类似于常规播放应用程序,但没有任何配置文件。因此,基本上,删除任何应用程序的
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的模板引擎。

我认为您的问题有两个不同点:

  • 如何将大型播放应用程序拆分为更小、更易于管理的模块
  • 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
第一点很简单,尽管在线文档中没有明确(AFAIK)的记录。一出戏!模块的构建类似于常规播放应用程序,但没有任何配置文件。因此,基本上,删除任何应用程序的
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的模板引擎。

我认为您的问题有两个不同点:

  • 如何将大型播放应用程序拆分为更小、更易于管理的模块
  • 如何为同一操作动态选择不同的视图(即,使用多个主题呈现相同的数据)
第一点很简单,尽管在线文档中没有明确(AFAIK)的记录。一出戏!模块的构建类似于常规播放应用程序,但没有任何配置文件。因此,基本上,删除任何应用程序的
conf/
文件夹,将其发布到您喜爱的存储库中,您就可以在另一个应用程序/模块中将该模块用作依赖项了

第二点有点棘手。由于播放模板是静态编译的,在运行时更改视图是不受支持的,因此您必须提出自己的解决方案

第一