#scala #akka #akka-http
Вопрос:
Каков наилучший способ разделения маршрутов, необходимых implicit ActorSystem
для разных файлов? Предположим, у меня есть этот (нерабочий) код
// in UserRoutes.scala object UserRoutes { val route: Route = ??? } // in OrderRoutes.scala object OrderRoutes { val route: Route = ??? } // In MyApp.scala object MyApp extends App { implicit val system = ActorSystem(Behaviors.empty, "my-system") implicit val ec = system.executionContext val route = UserRoutes.route ~ OrderRoutes.route Http().newServerAt("localhost", 8888).bind(route) }
Все эти маршруты делают HTTP-запросы , поэтому они требуют наличия ActorSystem
, каков наилучший способ их передачи? Создавайте объекты в классы и передавайте их конструктору или есть что-то более умное?
Комментарии:
1. Я бы остановился на классическом (облегченном) шаблоне внедрения зависимостей для scala, то есть, как вы говорите, преобразуйте маршруты в классы и поместите систему ActorSystem в конструктор
Ответ №1:
У вас может быть что-то вроде
// in UserRoutes.scala object UserRoutes { def route(implicit sys: ActorSystem): Route = ??? } // in OrderRoutes.scala object OrderRoutes { def route(implicit sys: ActorSystem): Route = ??? }
В вашем приложении у вас есть система актеров неявно, и тогда вы сможете сохранить val route = UserRoutes.route ~ OrderRoutes.route
все как есть.
Я обычно использую класс, если мне нужно воспользоваться некоторыми услугами
class UserRoutes(auth: AuthService, profile: ProfileService)(implicit sys: ActorSystem) { val route : Route = ??? }