Использование Akka IndirectActorProducer и сериализуемых реквизитов

Я хочу использовать Guice Dependency Injection с актерами Akka.

Документация Akka, здесь, предлагает использовать IndirectActorProducer для внедрение зависимости. Но это не объяснено, или я не понимаю, почему.

На мой взгляд, его следует использовать, чтобы избежать передачи несериализуемых компонентов/сервисов внутри Props. Но другие примеры, которые я нашел (здесь или здесь) пройти весь Injector класс, в котором я совершенно уверен не является сериализуемым.

Итак, мои вопросы:

  1. Как и почему следует использовать IndirectActorProducer?
  2. Props должен быть сериализуемым? Можно ли передавать Guice Injector в качестве параметров реквизита?

Я знаю, что есть похожие вопросы, но, на мой взгляд, четкого ответа пока нет:


person Davide Icardi    schedule 26.04.2019    source источник
comment
Почему Гайс? Он удаляет безопасность типов, и я не могу представить, чтобы он работал надежно, когда вы добавляете что-то вроде Akka Cluster. В Scala люди обычно отказываются от отражения во время выполнения и предпочитают отражение во время компиляции или отсутствие отражения и только типы. Есть ли какая-то веская причина для использования DI на основе отражения?   -  person Mateusz Kubuszok    schedule 26.04.2019
comment
@mateusz-kubuszok Основная причина в том, что мы уже используем Guice для других проектов, как с Java, так и со Scala, поэтому я предпочитаю аналогичную архитектуру. И мне нравится Guice, очень простой в использовании. Но меня интересуют другие подходы. Что ты посоветуешь? Я слышал о выкройке торта... Не могли бы вы указать мне пример для актеров Akka? Спасибо!   -  person Davide Icardi    schedule 27.04.2019
comment
Это может быть полезно: discuss.lightbend.com/t /   -  person Davide Icardi    schedule 30.04.2019


Ответы (1)


Возможно, это не тот ответ, который вы ищете, поэтому оставьте вопрос открытым на случай, если кто-то еще предоставит больше ответов на основе Guice.

В основном причина, по которой мы используем DI-фреймворки/библиотеки, связана с накладными расходами на передачу аргументов вручную и, возможно, также с развязкой реализации интерфейса (хотя последнее можно просто решить, передав функции в конструкторах и используя их для создания реализации, так что это не так). такой уж спор).

В Scala, по крайней мере, в кодовых базах, которые уходят от Java для более простых проектов, люди просто передают вещи в качестве аргументов:

class MyActor(name: String, surname: String) extends Actor { ... }

def createActor(name: String, surname: String) =
   system.actorOf(Props(MyActor.class, name, surname))

У людей, которые не любят делать что-то вручную, есть некоторые другие варианты, но большинство из них основаны на отражении времени компиляции, например. Macwire, который использует типы для внедрения:

// tags used to distinguish things - something like named instance in Guice
// but on types instead of strings
sealed trait Name
sealed trait Name
class MyActor(name: String @@ Name,
              surname: String @@ Surname) extends Actor { ... }

def createActor(name: String @@ Name, surname: String @@ Surname) =
   // wire is a macro that puts arguments into constructor by looking at
   // variables in the current scope and their types
   system.actorOf(Props(wire[MyActor]))

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

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

person Mateusz Kubuszok    schedule 29.04.2019
comment
Спасибо за информацию. Но проблема с не сериализуемыми реквизитами, я думаю, такая же. Допустим, вам нужно передать соединение с базой данных или любую другую не сериализуемую службу. Насколько я понимаю, в этом случае следует использовать IndirectActorProducer. И может использоваться как с Guice, так и с Macwire. Ты согласен? - person Davide Icardi; 30.04.2019