3

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

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

只需要对此进行一些澄清-使用 play 2.1,您是否必须在 DI 的路由文件中使用 @ 注释?

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

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

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

4

4 回答 4

7

我注意到您正在使用 Java。这是我如何让它工作以注入控制器。

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

我的控制器:

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());
    }
}

我的界面:

package models;

public interface MyInterface {
    String foo();
}

MyImplementation2Inject:

package models;

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

我的组件模块:

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"

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

于 2015-06-11T04:03:34.203 回答
2

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

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

干杯

于 2013-04-08T21:37:04.647 回答
2

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

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

于 2013-06-15T08:50:26.747 回答
1

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

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 即可)。

于 2013-03-28T13:45:25.597 回答