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" 

我希望這是對您有所幫助。:)