Attori come dipendenza:
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)
}
}
attori aventi dipendenze (dove non c'è nulla speciale ai):
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)
}
}
}
Che dire il contrario, non le cose che hanno attori come le dipendenze, ma attori che hanno le dipendenze, che è quello che penso l'OP chiedeva di. –
Thx per averlo indicato. Ho aggiornato la mia risposta. – agilesteel
Ma il mio problema è che quando ServiceActor deve passare un messaggio ad OtherServiceActor, allora il modo standard che ho letto sembra utilizzare il metodo "context.actorOf [OtherServiceActor]" per creare l'attore richiesto. A questo punto, ottengo errori se OtherServiceActor è incluso in un tratto in quanto non è in grado di istanziarlo in tale ambito. – Owen