【问题标题】:Play Framework Dependency InjectionPlay 框架依赖注入
【发布时间】: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 形式吗?
  • 我还没有 Guice 示例,但这里有一个注入控制器、DAO 等的 Spring 示例:github.com/jamesward/play2bars/tree/java-spring

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


【解决方案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 即可)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          • 2014-09-06
          • 2010-09-14
          • 2016-08-19
          • 2012-11-17
          • 2015-02-12
          • 1970-01-01
          相关资源
          最近更新 更多