Play 框架依赖注入
Posted
技术标签:
【中文标题】Play 框架依赖注入【英文标题】:Play Framework Dependency Injection 【发布时间】:2013-03-24 15:17:38 【问题描述】:我一直在谷歌上寻找一些关于如何在 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。
【问题讨论】:
不,那是错误的。像这样的循环依赖是一个糟糕的设计。服务可以拥有 DAO 并与其他服务协作,但 DAO 不应该拥有服务。 正确,这是有道理的。 为什么要同时使用 Play 和 Guice? Play 没有内置的 DI 形式吗? 这个怎么样? richard-foy.fr/blog/2011/11/26/… 我还没有 Guice 示例,但这里有一个注入控制器、DAO 等的 Spring 示例:github.com/jamesward/play2bars/tree/java-spring 【参考方案1】:我注意到您正在使用 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"
我希望这对您有所帮助。 :)
【讨论】:
【参考方案2】:我使用蛋糕模式和我自己的全局覆盖 getControllerInstance
https://github.com/benjaminparker/play-inject
干杯
本
【讨论】:
【参考方案3】:抱歉,回复晚了,但这是我们的示例
https://github.com/typesafehub/play-guice
【讨论】:
【参考方案4】:您是否尝试过使用与 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 即可)。
【讨论】:
以上是关于Play 框架依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
Play Framework 2.4 - 依赖注入替换 GlobalSettings.onStart()
Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException