Play Framework:Action内部的依赖注入

时间:2014-09-07 19:28:52

标签: dependency-injection playframework-2.0 guice

简短版本:如何在Play Framework中的Action中注入一个对象?

长版本:在我的项目中,我有自定义注释操作@AuthenticationRequired,它从数据库加载User对象并将其放入context.args。它使用实现UserDAO的DAO类。现在我想使用Google Guice注入Action的DAO类。我可以使用Guice并在控制器和测试中注入实例,但是我很难在Action中注入DAO类。

Injector是GlobalSettings实例上的字段。

我尝试覆盖GlobalSettings#onRequest()并将UserDAO实例放到context.args,然后从AuthenticationRequired内部检索它,但事实证明GlobalSettings#onRequest()返回的操作被调用最后在与@With和/或自定义注释一起使用的动作链中,所以,它是迟到的。

我还尝试通过注释动作构造函数来注入DAO实例,但它使用no-args构造函数来创建动作实例。

任何想法我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

对于play 2.5,你可以简单地在Action类的构造函数之上添加@Inject并注入所需的东西。这是我工作项目的一个片段(我使用Guice作为DI):

public class ChannelPermissionAction extends Action<ChannelPermission> {

  private final AuthorizationService authorizationService;
  private final AsyncHelper asyncHelper;

  @Inject
  public ChannelPermissionAction(AuthorizationService authorizationService, AsyncHelper asyncHelper) {
     this.authorizationService = authorizationService;
     this.asyncHelper = asyncHelper;
  }
  ...
 }

答案 1 :(得分:0)

你可以像控制器一样实现这一点 - 将你的行为描述为(在我的情况下是一个bean - 我正在使用spring IoC)一个依赖项并通过

调用它
public <A> A getControllerInstance(Class<A> clazz)
Application Global object

。这就是你所需要的 - 你的依赖关系会被注入。 BTW。需要使用每个实例创建操作,因此在我的情况下,我应该使用“prototype”范围。 在使用Guice时注意它 - 它应该具有类似的功能。