【问题标题】:Scala Play 2.4.x controller class chaining?Scala Play 2.4.x 控制器类链接?
【发布时间】:2015-09-30 13:32:22
【问题描述】:

我正在使用 play-slick-3.0 项目作为迁移我拥有的旧版 Play 项目的基础。遗留的controller.Application 曾经是一个对象,现在是一个类,同样所有其他控制器实现都是对象,现在是类。遗留项目正在执行“控制器链接”,即应用程序委托给其他控制器:

class Application extends Controller {
...
  def uploadDo(context: String) = { implicit request ⇒ 
    // a lot of boilerplate code common to all contexts
    context match {
      case "aum" ⇒ AumController.uploadDo(storedFile)
      case "portfolio" ⇒ PortfolioController.uploadDo(storedFile)
      case "price" ⇒ PriceController.uploadDo(storedFile)
    }
    // more boilerplate code common to all contexts
  }
}

问题是我不能再做那种委托了,因为 AumController 是一个类而不是一个对象了。我也不能定义关联的对象,因为这些类被实例化并且依赖项是由框架注入的......例如参见同一项目中的Application.scala,无法直接实例化它。

如何修复/迁移上述委托问题?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    你或许可以利用反向路由策略

      class Application extends Controller {
       ...
       def uploadDo(context: String) = { implicit request ⇒ 
        // a lot of boilerplate code common to all contexts
        context match {
          case "aum" ⇒ routes.AumController.uploadDo(storedFile)
          case "portfolio" ⇒ routes.PortfolioController.uploadDo(storedFile)
          case "price" ⇒ routesPriceController.uploadDo(storedFile)
        }
        // more boilerplate code common to all contexts
      }
    }
    

    【讨论】:

    • 如果这回答了您的问题,请接受答案。
    • 我收到错误:value AumController is not a member of object controllers.routes
    • 如果您的所有控制器都在控制器包中定义,则此方法有效。如果你在一个子包中定义了你的控制器,比如 ex : controllers>package1>AumController ,那么对应的反向路径是 ... controllers.package1.routes.AumController
    • 没有。所有的控制器都是直接在控制器包下直接定义的,但是路由仍然没有拾取它们。
    • 我还收到错误value uploadDo is not a member of controllers.ReverseAumController 发生了一些奇怪的事情,即并非所有控制器功能都已生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2013-11-02
    • 2015-09-30
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多