Как использовать провайдера для внедрения зависимостей, используя guice в playframework - PullRequest
0 голосов
/ 24 ноября 2018

Я использую Playframework 2.4, вот мой код

trait UserRepositoryTrait {
  val userRepo:UserRepository
  val sessionRepo:SessionRepository 
}

class UserRepositoryImpl extends UserRepositoryTrait {
  @Inject @Named("userRepo")val userRepo:UserRepository= null 
  @Inject @Named("sessionRepo") val sessionRepo:SessionRepository = null
  }

, а вот класс модуля

class UserDependencyModule extends AbstractModule { 

    @Override
      protected def configure() {
        bind(classOf[UserRepository]).annotatedWith(Names.named("userRepo")).toInstance(new UserRepo)
        bind(classOf[SessionRepository]).annotatedWith(Names.named("sessionRepo")).toInstance(new SessionRepo)
                bind(classOf[UserRepositoryTrait]).to(classOf[UserRepositoryImpl])
      }

}

в application.conf

play.modules.enabled += "models.guice.UserDependencyModule"

все работаетхорошо, если я внедряю эту черту в контроллер, но я хочу внедрить эту черту в класс, вот код

class StatusChange @Inject() (userRepository:UserRepositoryTrait) {
}

, и мне нужно вызвать StatusChange.scala в Service.scala классе, как я могу создать экземпляр StatusChange.scala объект

class ArtworkService() {

val status= new StatusChange(//what should i add here?)

}

я читал о провайдерах, но я не могу понять, как я могу использовать его для моего сценария? Пожалуйста, сообщите мне

обновить , если ясделать это так будет правильно?

class ArtworkService @inject (userRepository: UserRepositoryTrait) {

    val status= new StatusChange(userRepository)

    }

и в контроллере

class MyController @inject (userRepository: UserRepositoryTrait)
{
 val artworkService = new ArtworkService(userRepository)
}

1 Ответ

0 голосов
/ 04 декабря 2018

Вам не нужно использовать провайдера здесь. Поставщик полезен для разрешения циклических ссылок на зависимости.

В вашем случае вы можете просто сделать:

class ArtworkService @Inject (status: StatusChange) {}

И затем напрямую ввести ArtworkService в свой контроллер:

class MyController @Inject (artworkService: ArtworkService) {}

Поставщик вошел бы в картину, если бы у вас была ссылка на цикл.Например:

class ArtworkService @Inject (status: StatusChange) {}

class StatusChange @Inject (artworkService: ArtworkService) {}

Здесь у нас есть цикл ArtworkService -> StatusChange && StatusChange -> ArtworkService Итак, провайдер приходит на помощь в этих ситуациях.Вы можете решить эту проблему следующим образом:

class ArtworkService @Inject (status: StatusChange) {}

class StatusChange @Inject (artworkServiceProvider: Provider[ArtworkService]) {}
...