2014-04-02 24 views
3

是否有类型检查在阿卡(斯卡拉)的ActorRef任何模式?当我传递给其他演员的引用时,我想确保它是正确的类型。然而,得到一个参考时,使用一个演员的context,它总是返回ActorRef,所以我真的不能使用子类进行检查。如何在注入依赖时检查Actor/ActorRef的类型?

一个具体的例子如下。在Akka中,我通过将ActorRef传入另一个Actor的构造函数来注入依赖关系。请看下面的人为的例子:Speaker被构造有以Listener的参考。我在伴侣对象中创建了一个道具构造函数,正如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型也。有没有一种模式可以解决这个问题?

回答

3

有一些可能性。

对于一个你无法监听传入构造,但使用ActorSelection而不是看它。为此,你需要知道路径,然而,这可能是棘手的,取决于你的演员层次结构。我没有用过这么多,但是因为查找是异步的,所以我希望你需要跳过一些环节来避免时间问题,并在尚未初始化时获取消息。另外我认为这可能是单元测试中的一个麻烦。

我在其中一个项目中使用的另一种方法是创建一个工厂,根据我想要的演员类型返回actorrefs。当你考虑演员阶层和临时演员时,这可能会变得杂乱无章。该工厂使用依赖注入来创建参与者并将其存储在内部以允许查找。在我们的用例中工作得很好,单元测试非常好,因为您可以嘲笑工厂并轻松返回testProbe。这需要一些工作来实现,但你需要IndirectActorProducer和更多的东西来使它工作。

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