我不知道如何使用蛋糕模式确保我的演员有适当的依赖关系。 我还在逐渐掌握这个过程,但我无法找到任何示例。我基本上只是在寻找教程/资源来学习。
谢谢,克里斯。
我不知道如何使用蛋糕模式确保我的演员有适当的依赖关系。 我还在逐渐掌握这个过程,但我无法找到任何示例。我基本上只是在寻找教程/资源来学习。
谢谢,克里斯。
演员作为依赖关系:
trait DBComponent {
def db: ActorRef // no compile time guarantees
type K
type V
object DBActor {
case class Put(key: K, value: V)
case class Get(key: K)
}
class DBActor {
import DBActor._
val db = scala.collection.mutable.Map.empty[K, V]
def receive = {
case Put(k, v) => db.put(k, v)
case Get(k) => sender ! db.get(k)
}
}
}
trait ServiceComponent {
this: DBComponent =>
import DBActor._
// you could be talking to deadLetters for all you know
def put(k: K, v: V): Unit = db ! Put(k, v)
def get(k: K): Option[V] = {
implicit val timeout = Timeout(5 seconds)
val future = ask(actor, Get(k)).mapTo[Option[V]]
Await.result(future, timeout.duration)
}
}
有依赖关系的演员(其中没有什么特别之处):
trait DBComponent {
def db: DB
type K
type V
trait DB {
def put(key: K, value: V): Unit
def get(key: K): Option[V]
}
}
trait ServiceComponent {
this: DBComponent =>
object ServiceActor {
case class Put(key: K, value: V)
case class Get(key: K)
}
class ServiceActor {
import ServiceActor._
def receive = {
case Put(k, v) => db.put(k, v) // db is in scope
case Get(k) => sender ! db.get(k)
}
}
}
还有一个需要注意的问题,正如Owen所指出的那样,使用actorOf(Props[MyClass])
创建Actor对于内部类是行不通的。也就是说,以下代码会失败:
trait MyComponent {
class MyActor {
def receive = ...
}
}
new MyComponent {
val myActorRef = system.actorOf( Props[MyActor] )
}
val myActorRef = system.actorOf( Props( new MyActor(arg1, arg2) ) )
想知道是否有更好的方法...
system.actorOf(Props[ServiceActor])
实例化,它会抛出异常,但是如果使用system.actorOf(Props(new ServiceActor))
就可以正常工作。 - Cristian Vrabie