вызов методов Controller из сопутствующих объектов scala

В моем проекте есть контроллер с методом сокета. Я хочу вызвать этот метод в объекте-компаньоне. Но почему-то я не могу этого сделать, так как мне нужно передать параметры также объекту-компаньону, который я не могу . Вот мой пример кода:

class WebSocketController @Inject() (cache:CacheApi)(implicit actorSystem:ActorSystem, materializer:Materializer) extends Controller {

def socket  = WebSocket.accept[JsValue , JsValue] { request => 
ActorFlow.actorRef(out => SocketHandlerClass.props(out,postActor))

}


}


/*My Companion Object */

object WebSocketController {

/* how to call socket method here ???*/

}

person Aniket Pandey    schedule 01.07.2016    source источник
comment
Сопутствующий объект можно рассматривать как набор статических vals/vars/defs. Функция сокета определена в экземпляре WebSocketController. Другими словами, это невозможно сделать без создания экземпляра WebSocketController.   -  person irundaia    schedule 01.07.2016
comment
Итак, как мне создать экземпляр класса WebSocktetController со всеми этими необходимыми аргументами. В основном я хочу вызвать метод сокета из другого проекта, сделав это как банку. И я не понимаю, как это сделать с сопутствующими объектами в этом случае.   -  person Aniket Pandey    schedule 01.07.2016


Ответы (1)


Хотя это технически возможно, вы не должны этого делать, потому что статический вызов методов делает ваш код тесно связанным и сводит на нет другие преимущества внедрения зависимостей, такие как насмешки в тестах.

Как вы должны это сделать: все, что вы планируете делать в объекте-компаньоне, сделайте это в каком-нибудь другом class, а затем внедрите этот класс.

Как вы могли бы сделать это с сопутствующим объектом Обратите внимание, что это устарело в play 2.5 и будет удалено в play 2.6, но если вы действительно хотите получить экземпляр этот класс внутри объекта-компаньона, вы можете сделать это:

Play.current.injector.instanceOf[WebSocketController]

Однако, помимо того, что это, по сути, устраняет внедрение зависимостей, вызов метода контроллера извне выглядит довольно неудачным выбором дизайна. Контроллеры не должны содержать никакой логики - и, как сказано выше, вы должны извлечь свою логику в другой класс и внедрить ее в контроллер.

person rethab    schedule 01.07.2016
comment
хорошо. Но даже в обоих случаях мне придется вызывать функцию сокета. Как это будет достигнуто, я не понимаю? - person Aniket Pandey; 01.07.2016
comment
Только во втором (не рекомендуемом) случае. Может быть, вам следует объяснить, чего вы пытаетесь достичь здесь - person rethab; 01.07.2016
comment
Я пытаюсь использовать свой код как банку и использовать такие методы, как сокет, в других проектах. но я не могу вызывать методы напрямую даже после «импорта». для этого, если я не ошибаюсь, мне придется использовать сопутствующие объекты. проблема в том, что я хочу вызвать функцию сокета. и я не ясно (говоря это снова), как это сделать. - person Aniket Pandey; 01.07.2016
comment
Почему вы хотите вызвать эту функцию? Контроллеры вызываются клиентом через HTTP. Если ваш контроллер содержит логику, вы делаете это неправильно. Если у вас есть какая-либо логика, которой вы хотите поделиться с другими компонентами (или jar-файлами, если на то пошло), извлеките эту логику в какой-либо другой класс. - person rethab; 01.07.2016
comment
Забудьте о контроллере. Если эта функция сокета с тем же телом находится в другом классе. И я хочу вызвать тот же метод из другого места, как это сделать? - person Aniket Pandey; 01.07.2016
comment
Я описал, как вызвать метод экземпляра из метода-компаньона. Если вы не знаете, как вызвать метод как таковой, то это другой вопрос. - person rethab; 03.07.2016