scaldi模块

时间:2017-01-28 13:31:00

标签: scala playframework scaldi

似乎我可以在不使用Module的情况下注入Services或Akka Actors。我可以知道Module的目的是什么?

class Hello(implicit inj:Injector) extends Controller with AkkaInjectable {
  val greetingService = inject[GreetingService]
  implicit val system = inject [ActorSystem]
  val greetingActor = injectActorRef[greetingActor]

  def greet(person:Person) = Action {
    Ok(greetingService.greet(person.name))
  }
}

即使没有以下它也可以正常使用

class MainModule extends Module {
  binding to new GreetingService
  bind [ActorSystem] to ActorSystem("ScaldiAkkaExample") destroyWith (_.terminate())
  binding toProvider new StatisticsProvider
}

1 个答案:

答案 0 :(得分:2)

模块基本上实例化服务,当您将它们注入控制器时,所有控制器共享同一个实例(这就是我们想要的)。 如果不在模块中声明绑定,您将在每个控制器中都有一个新的服务实例(这不是我们想要的)。

然而在Akka中则相反

引自scaldi

  

我想指出演员是如何受约束的。重要的是,用toProvider函数绑定它们。当您使用injectActorRef或injectActorProps注入它们时,它将确保Scaldi始终创建Actor类的新实例