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

在 Akka actor 中玩 2.4 依赖注入

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

如何在 Play 2.6 控制器中使“CustomExecutionContext”可用于依赖注入?

依赖注入 ---- 系列文章

玩法 2.5:模板中的依赖注入