Play Framework依赖注入

时间:2013-03-24 15:17:39

标签: java dependency-injection playframework guice playframework-2.1

我一直在谷歌寻找一些有关如何在Play Framework 2.1中使用Guice / Spring DI的有用信息

我想要做的是在一些DAO中注入多个服务,反之亦然。

需要对此进行一些澄清 - 使用play 2.1,你是否必须在路径文件中使用@ annotation进行DI?

我在这里查看了这个指南 - https://github.com/playframework/Play20/blob/master/documentation/manual/javaGuide/main/inject/JavaInjection.md

并应用以下步骤在app中创建Global类并在Build.scala中添加GUICE依赖项,但在调用注入的对象时继续获取空指针异常。

有没有人能够使用Guice在Play 2.1中使用DI?我在互联网上看到了一些例子,但他们似乎都在控制器中使用DI。

4 个答案:

答案 0 :(得分:8)

我注意到你正在使用Java。以下是我如何将其用于注入控制器。

首先,我创建了以下4个类:

myController的:

package controllers;

import play.mvc.*;
import javax.inject.Inject;

public class MyController extends Controller {

@Inject
private MyInterface myInterface;
    public Result someActionMethodThatUsesMyInterface(){
        return ok(myInterface.foo());
    }
}

MyInterface的:

package models;

public interface MyInterface {
    String foo();
}

MyImplementation2Inject:

package models;

public class MyImplementation2Inject implements MyInterface {
    public String foo() { 
        return "Hi mom!";
    }
}

MyComponentModule:

package modules;

import com.google.inject.AbstractModule;
import models.MyInterface;
import models.MyImplementation2Inject;

public class ComponentModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MyInterface.class).
                to(MyImplementation2Inject.class);
    }
}

现在最后一部分,我花了很长时间才弄清楚,是注册模块。您可以通过将以下行添加到位于application.conf目录中的conf文件的末尾来执行此操作:

play.modules.enabled += "modules.MyComponentModule"

我希望这对你有所帮助。 :)

答案 1 :(得分:2)

我使用蛋糕模式和我自己的全局覆盖getControllerInstance

版本

https://github.com/benjaminparker/play-inject

干杯

答案 2 :(得分:2)

对不起,这是一个迟到的回复,但这是我们的例子

https://github.com/typesafehub/play-guice

答案 3 :(得分:1)

您是否尝试过使用与Guice不同的DI方法? 我们还尝试使用Guice或Spring实现一个项目,但最后在实现特征的对象中注册我们的依赖项,如:

trait Registry {
   def userDao: UserDao
...

}

object Registry {
  var current: Registry = _
}

object Environnment {
 object Dev extends Registry {
  val userDao = ...
//implement your environment for develpment here
}
 object Test extends Registry {
  val userDao = ...
//implement your ennviroment for tests here e.g. with mock objects
}
}

另一种可能适合你的好方法是蛋糕模式(只是google)。