3

Я искал во всем Google, чтобы найти полезную информацию о том, как использовать Guice/Spring DI в Play Framework 2.1Play Framework Dependency Injection

То, что я хочу сделать, это Вводят несколько служб в некоторых DAO-х и наоборот.

Просто нужно пояснить это. С игрой 2.1 вам нужно использовать аннотацию @ в файле маршрутов для DI?

Я смотрел на это руководство здесь - https://github.com/playframework/Play20/blob/master/documentation/manual/javaGuide/main/inject/JavaInjection.md

и применяются следующие шаги создания глобального класса в приложении, и добавление зависимостей Guice в Build.scala, но держать на получение исключения нулевого указателя при вызове на инжектируемый объект.

Может ли кто-нибудь получить DI, работающий в Play 2.1, используя Guice? Я видел примеры через Интернет, но все они, кажется, используют DI внутри контроллера.

+5

Нет, это неправильно. Круговые зависимости вроде плохой дизайн. Сервисы могут иметь DAO и сотрудничать с другими службами, но DAO не должны иметь услуг. – duffymo

+0

Правильно, это имело бы смысл. – unleashed

+0

Зачем вам использовать Play и Guice? Не воспроизводится ли форма DI? – duffymo

ответ

1

Вы пробовали использовать какой-то другой подход к DI, чем Guice? Мы также попытались реализации проекта с Guice или весной, но в итоге в регистрации наших зависимостей в объектах, реализующих черты, такие как:

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 для него) ,

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" 

Я надеюсь, что это было полезно для вас.:)