如何在注入依赖时检查Actor/ActorRef的类型?

3
在Akka(scala)中,有没有检查ActorRef类型的模式?当我将引用传递给另一个actor时,我想确保它是正确类型的。但是,在获取引用时,使用actor的始终返回ActorRef,因此我无法真正使用子类化来检查这一点。
下面是一个具体的例子。在Akka中,我通过将ActorRef传递到另一个Actor的构造函数中来注入依赖项。请看下面的人为示例:Speaker构造时使用Listener引用。我在伙伴对象中创建了一个props构造函数,这是Akka文档所鼓励的。
package test
import akka.actor._

object scratchpad {
   object Speaker {
     def apply(listener : ActorRef) : Props = Props(classOf[Speaker],listener)
   }

   class Speaker private(listener : ActorRef) extends Actor {
         override def preStart() = listener ! "knock knock"
   }

   class Listener extends Actor {
     def receive : Receive = {
       case "knock knock" =>
         //received message
     }
   }

   val system = ActorSystem("test")
   val listener = system.actorOf(Props[Listener])
   val speaker = system.actorOf(Speaker(listener))
}

问题在于我可以创建另一个演员,比如说DeafMute,并将其传递进去 - 但编译器不会捕捉到这一点,因为它也是ActorRef类型。有没有一种模式可以解决这个问题?
1个回答

3

有一些可能性。

首先,您可以不将监听器传递到构造函数中,而是使用ActorSelection查找它。但是,这需要知道路径,这可能会因您的Actor层次结构而异。我没有经常使用过这个方法,但是由于查找是异步的,我预计您需要跳过一些麻烦,以避免定时问题并在未初始化时接收消息。此外,我认为这可能会在单元测试中成为一个麻烦。

我在我的一个项目中使用了另一种方法,即创建一个工厂,根据我想要的Actor类型返回actorrefs。但是,考虑到Actor层次结构和临时Actor,这可能会变得混乱。该工厂使用依赖注入来创建Actor并在内部存储它们以进行查找。在我们的用例中运行良好,非常适合单元测试,因为您可以模拟工厂并轻松让其返回testProbes。但是,要实现这一点需要一些工作,您需要IndirectActorProducer和其他一些东西才能使其正常工作。

除此之外,问题是这是否真的是一个问题。通常你会有“管道”,即将演员连接在层次结构的父节点中心化。如果你错误地连接了演员,你的测试应该可以捕捉到,另外你可以激活未处理消息的日志记录。需要一些时间来适应它,但是没有设置正确的演员连接检查并不是很糟糕,你只需要纪律和一个好的测试套件。这类似于静态与动态类型的辩论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接