3

我一直在寻找所有谷歌找到如何在游戏框架使用吉斯/春DI一些有用的信息2.1播放框架依赖注入

我想要做的就是注入一些服务在一些DAO的和反之亦然。

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

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

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

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

+5

不,这是错误的。像这样的循环依赖是一个糟糕的设计。服务可以有DAO并与其他服务协作,但DAO不应该有服务。 – duffymo 2013-03-24 15:19:37

+0

正确,这是有道理的。 – unleashed 2013-03-24 15:37:19

+0

为什么你会同时使用Play和Guice?不玩有一种内置的DI的形式? – duffymo 2013-03-24 15:52:48

回答

1

您是否尝试过使用一些不同于DI的方法来处理DI? 我们也试图实现与吉斯和春天有个项目,但在实现的性状,如对象注册我们的依赖结束:

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 
} 
} 

另一个好办法至极可能适合你的是蛋糕的图案(只是谷歌它) 。

7

我注意到你正在使用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!"; 
    } 
} 

MyComponentM模块:

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" 

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