最近我发现自己在类中包装了actors,这样我就可以找回一些在处理ActorRef
s 时失去的类型安全性。最后,问题是,我不仅需要发送特定消息,还需要将响应转换为预期结果。所以我认为我可以向包含的参与者发送消息,Promise
以便他们最终报告结果。
这是个坏主意吗?它对我来说看起来很整洁......类型安全并且效果一样好。为什么没有人提出这个想法?有什么我没有注意到的问题吗?
询问基于模式的解决方案
case class GetUser(id:Long)
(actorRef ! GetUser(1l)).mapTo[User]
class UserRepoActor extends Actor{
def receive={
case GetUser(id)=>
sender() ! getUser(id)
}
...
}
基于承诺的解决方案
case class GetUser(id: Long, resp: Promise[User])
val req = GetUser(1l,Promise())
actorRef ! req
req.resp.future // No casting!!
class UserRepoActor extends Actor{
def receive={
case GetUser(id,resp)=>
response.success(getUser(id))
}
...
}