使用Akka IndirectActorProducer和可序列化的道具

时间:2019-04-26 09:19:40

标签: scala dependency-injection akka guice akka-actor

我想与Akka Actor一起使用Guice依赖注入。

Akka文档here建议使用Function UpdateMembership ([string[]]$arr,[string[]]$group) { write-host $arr[0] write-host $arr[1] write-host $Group[0] } $OUs = @( "test1", "test2" ) $groupname = @("group") UpdateMembership @Ous @groupname $groupname = @() $Ous = @() 进行依赖项注入。 但这并没有解释,或者我不明白原因。

我认为应该使用它以避免在Props内部传递不可序列化的组件/服务。但是我发现的其他示例(herehere)传递了整个IndirectActorProducer类,我确信它不能序列化。

所以我的问题是:

  1. 应如何以及为什么使用Injector
  2. IndirectActorProducer必须可序列化?是否可以将Guice Props作为道具参数传递?

我知道也有类似的问题,但我认为尚无明确答案:

1 个答案:

答案 0 :(得分:0)

这可能不是您要查找的答案,因此请保持开放状态,以防其他人提供更多基于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之类的问题。