1

我正在玩 Play!框架,我想创建一个名为 Services 的工厂,它将创建新的参与者。到目前为止我有这个

class UserRegistration extends Actor {
  def receive = {
    case "foo" => "bar"
  }
}

object UserRegistration {
  val path: String = "user/registration"
}


object Services {
  val system = ActorSystem("Services")

  def apply[A<:Actor]: ActorRef = system.actorOf(Props[A], A.path)
}

我想创建消息并将消息传递给这样的演员:

Services[UserRegistration] ? "hello"

但我得到类型的错误could not find implicit value for evidence parameter of type ClassManifest[A]。谁能告诉我我在这里做错了什么?如果这通常是一个有效的结构(最佳实践)。我是 Scala 的新手,还在学习东西。

谢谢!

4

2 回答 2

1

apply对象的方法Props隐式地采用类型参数ClassManifest[T]

apply [T <: Actor] (implicit arg0: ClassManifest[T])

您必须将此类参数添加到您的方法中:

def apply[A<:Actor : ClassManifest]: ActorRef = system.actorOf(Props[A])
于 2012-12-28T12:01:04.197 回答
1

senia 的回答也有效,但是如果你想为每种类型的演员指定一个公共路径,你需要第二个隐式参数(第一个是ClassManifest你可以为每种类型的演员指定一个路径。请记住演员名称但是必须是独一无二的,所以你必须在那个路径上添加一些东西。

首先,您定义一个包含路径的类:

case class Path(value:String)

然后你在你的actor类的伴生对象中定义一个隐式值:

object SomeActor {
  implicit val path = Path("SomeActor")
}

最后,您修改 apply 方法以采用隐式类清单和隐式路径。

def apply[A<:Actor](implicit cm:ClassManifest[A], path:Path[A]): ActorRef = 
  system.actorOf(Props[A], path.value + someIndex)
于 2012-12-28T12:07:59.613 回答