Инъекция зависимостей PlayFramework Scala Javax

Я новичок в Scala и PlayFramework и пытаюсь понять, как я могу сделать инъекцию зависимостей. В основном мне нужен файл, который будет трейтом, и внедрить его в контроллер. Моя проблема в том, что мой класс контроллера не видит мою черту, это мой код

ПрофильТрейт

package traitss

import play.api.mvc._


trait ProfileTrait extends Controller {
    def Addone()
  }

Затем я пытаюсь ввести это в свой контроллер.

import java.nio.file.{Files, Paths}

import traitss.ProfileTrait_
import play.api.mvc.{Action, Controller}
import javax.inject._

class Profiles @Inject() (profileTrait: ProfileTrait)   extends Controller
{

}

Однако мой контроллер его не видит, я пытаюсь следовать примеру здесь https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection . Я использую игровую среду версии 2.50.


person user1591668    schedule 18.05.2016    source источник
comment
Я снял подчеркивание, но проблема осталась.   -  person user1591668    schedule 18.05.2016
comment
Прежде всего, вы не должны внедрять контроллер в контроллер... Если у вас есть общий сервис, вы должны внедрить его в каждый контроллер независимо.   -  person insan-e    schedule 18.05.2016


Ответы (2)


Вы не можете внедрить черту напрямую. Вам нужно указать реализацию трейта, который необходимо внедрить.

Существует два способа указать реализацию трейта, который необходимо внедрить:

Использование аннотации @ImplementedBy. Вот простой пример:

package traitss

import play.api.mvc._
import com.google.inject.ImplementedBy

@ImplementedBy(classOf[ProfileTraitImpl])
trait ProfileTrait extends Controller {
    def Addone()
}

class ProfileTraitImpl extends ProfileTrait {
    // your implementation goes here
}

Использование программных привязок

package traitss

import play.api.mvc._
import com.google.inject.ImplementedBy

@ImplementedBy(classOf[ProfileTraitImpl])
trait ProfileTrait extends Controller {
    def Addone()
}

ProfileTraitImpl:

package traitss.impl

class ProfileTraitImpl extends ProfileTrait {
    // your implementation goes here
}

Создайте модуль, в котором вы можете связать реализацию с чертой

import com.google.inject.AbstractModule

class Module extends AbstractModule {
  def configure() = {

    bind(classOf[ProfileTrait])
      .to(classOf[ProfileTraitImpl])
  }
}

При использовании модульного подхода вы получаете дополнительное преимущество включения или отключения привязки. Например, в файле application.conf вы можете включить/отключить модуль, используя play.modules.enabled += module ИЛИ play.modules.disabled += module

person Tarang Bhalodia    schedule 03.12.2018

Вы не можете внедрить трейт, вы должны внедрить объект, реализующий этот трейт.

Чтобы инъекция зависимостей работала, вы должны сообщить фреймворку (игра использует Guice под капотом), как разрешить инжектируемую зависимость. Есть много способов сделать это, и это зависит от вашего случая. Более подробную информацию вы можете найти в документации Guice. самый простой способ — создать Module.scala в вашем каталоге app , если его там еще нет, и поместить что-то вроде этого:

import com.google.inject.AbstractModule
class Module extends AbstractModule {
  override def configure() = {
    bind(classOf[ProfileTrait]).toInstance( ... )
  }
} 

где в ... вы помещаете логику для создания объекта, который хотите внедрить.

person Roberto Congiu    schedule 18.05.2016