【问题标题】:Why method of controllers in Play! framework are static为什么在 Play 中使用控制器方法!框架是静态的
【发布时间】:2012-12-15 14:11:41
【问题描述】:

我正在使用 Play!我的一个应用程序的框架 1.2.5。最初,我通过创建类的新实例或使用工厂来解决依赖关系。但是我的应用程序在增长,并且以这种方式管理依赖项变得更加困难。我将转向使用 Google Guice 进行依赖注入

看起来,对于每个控制器,我都必须写

requestStaticInjection(MyController.class);

在控制器中注入服务

@Inject
static MyService mySerivce;

这令人沮丧,我不喜欢控制器具有静态方法并且只能访问静态变量。我想将依赖项传递给控制器​​的构造函数,我不想声明静态字段。

为什么播放控制器的方法是静态的?这是某种限制吗?还有其他将类注入 Play 的好方法!控制器

【问题讨论】:

标签: dependency-injection playframework guice playframework-1.x


【解决方案1】:

老问题,但我遇到了同样的问题,我在这里找到了答案http://typesafe.com/blog/announcing-play-framework-21-the-high-velocit 虽然,它与您使用的 Play 版本不同...

Play 2.1 现在支持一种新的路由语法,可以调用注入的控制器而不是静态方法。只需在路由文件中为控制器方法添加前缀“@”符号

GET     /                  @controllers.Application.index()

在你的 conf/routes 中

【讨论】:

  • 很高兴知道,Play 正在改进。顺便说一句,我的应用程序在增长,现在我宣布选择 Play 是我最大的错误。
【解决方案2】:

还有其他将类注入 Play 的好方法!控制器

没有。您不应该在控制器中创建服务 - 使其成为不扩展控制器的常规类。然后从您的控制器调用服务类。将控制器代码保持在最低限度 - 那里有很多字节码魔法,因此请保持控制器代码简单(查找对象、渲染结果等)

【讨论】:

  • 问题是如何从静态控制器调用其他类。看起来,没有那么多选择,使用 guava 可以使用 requestStaticInjection 方法完成
  • 我的意思是,如果不够清楚,请不要在 Controller 类上执行此操作。不过这很简单,只需在项目的 app/models/ 部分中创建您的服务,您就可以在那里使用任何您喜欢的东西。我只是想温和地建议你不要用锤子的错误一端敲钉子! :) 播放控制器不是一个普通的 Java 类 - 跟踪它有时会发生什么 - 有很多字节码注入。
  • 感谢您的建议,但问题是关于向控制器 1234562 注入服务的正确方法 =)
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多