https://github.com/codingwell/scala-guice/をチェックしてください。これを基にしたサンプルです。それは可能にする
bindActor[MyActor].withName("mines")
アクター自体ではなく、非ジェネリックな ActorRef をバインドしていることに注意してください。これにより、@Named("foo") ActorRef のバインディングが作成されます。アクターを直接操作しないでください。
プロバイダでキーを取得できません。プロバイダーは、キーやインジェクション ポイントなどで試したようなコンテキスト インジェクションを行いません。できることは、アクター バインディングごとにプロバイダーの異なるインスタンスを作成し、後でそれを ActorSystem に注入することです。または、API を変更してアクター システム インスタンスも含めることができます。
trait AkkaModule extends AbstractModule {
// should be:
// this: AbstractModule =>
// see http://lampsvn.epfl.ch/trac/scala/ticket/3564
import ScalaModule._
private def binderAccess = super.binder // shouldn't need super
def bindActor[T <: Actor](implicit m: Manifest[T]) = new ActorBindingBuilder {
//Hack, no easy way to exclude the bind method that gets added to classes inheriting ScalaModule
//So we experamentally figured out how many calls up is the source, so we use that
//Commit 52c2e92f8f6131e4a9ea473f58be3e32cd172ce6 has better class exclusion
val mybinder = binderAccess.withSource((new Throwable).getStackTrace()(3))
val self = (mybinder bind classOf[ActorRef]).asInstanceOf[AnnotatedBindingBuilder[ActorRef]]
}
}
object AkkaModule {
class ActorProvider(val name: String) extends Provider[ActorRef] {
@Inject var system: ActorSystem = _
def get = {
system.actorFor(system.name + "/user/" + name)
}
}
trait ActorBindingBuilder {
val mybinder: Binder
val self: AnnotatedBindingBuilder[ActorRef]
def withName(name: String) = {
val provider = new ActorProvider(name)
self.annotatedWith(Names.named(name)).toProvider(provider)
mybinder.requestInjection(provider)
}
}
}