scala - 如何将()注入(inject)到具有构造函数参数的类中?

标签 scala dependency-injection playframework actor

我有一个 WebSocket创建每个连接参与者处理程序的 Controller :

class WebSocketController @Inject()(cc: ControllerComponents)(implicit exc: ExecutionContext) {
  def socket: WebSocket = WebSocket.accept[JsValue, JsValue] { request =>
    ActorFlow.actorRef { out => // Flow that is handled by an actor from 'out' ref
      WebSocketActor.props(out) // Create an actor for new connected WebSocket
    }
  }
}

在 Actor 处理程序中,我需要使用 ReactiveMongo :
trait ModelDAO extends MongoController with ReactiveMongoComponents { 
  val collectionName: String
  ...
}
class UsersCollection @Inject()(val cc: ControllerComponents,
                                val reactiveMongoApi: ReactiveMongoApi,
                                val executionContext: ExecutionContext,
                                val materializer: Materializer)
  extends AbstractController(cc) with ModelDAO {
  val collectionName: String = "users"
}

所以,通常的方法是 @Inject() UsersCollection在目标类中。但我不能做这样的事情:
class WebSocketActor @Inject()(out: ActorRef, users: UsersCollection) extends Actor { ... }

因为actor实例在WebSocketActor内部创建伴生对象:
object WebSocketActor {
  def props(out: ActorRef) = Props(new WebSocketActor(out))
}

如何使用 UsersCollection里面WebSocketActor ?

最佳答案

您可以创建 Actor 谁的依赖项将由 Play 自动注入(inject)。没问题。 (https://www.playframework.com/documentation/2.6.x/ScalaAkka)

但是如果是网络套接字, Prop 预期的 Actor ,但不是 Actor (或 ActorRef)本身。

ActorFlow.actorRef { out => // Flow that is handled by an actor from 'out' ref
   WebSocketActor.props(out) // <- ACTOR IS NOT CREATED HERE, WE RETURN PROPS
}

所以在这种情况下没有办法自动完成(至少我没有找到它)。

你可以做的是通过UsersCollection手动。
class WebSocketController @Inject()(cc: ControllerComponents, usersCollection: UsersCollection)(implicit exc: ExecutionContext) {
  def socket: WebSocket = WebSocket.accept[JsValue, JsValue] { request =>
    ActorFlow.actorRef { out => // Flow that is handled by an actor from 'out' ref
      WebSocketActor.props(out, usersCollection) //<- ACTOR IS NOT CREATED HERE, WE RETURN PROPS
    }
  }
}

注意到我注入(inject)了 UsersCollection进入 WebSocketController并将其传递给 Prop 。

简单,我没有看到任何缺点。

关于scala - 如何将()注入(inject)到具有构造函数参数的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252946/

相关文章:

scala - 如何在 netbeans (Windows) 上使用 scala

java - 在 Play 中使用@select! Framework 2.3模板和Java

WCF依赖注入(inject)和抽象工厂

sql - 如何知道异常插入查询是否成功?

java - Play框架+Spring : Injecting URL from application.conf

scala - 对无限参数应用函数

scala - 相互递归 scala 解析器中的堆栈溢出

angular - 为什么我应该在简单的对象配置上使用 Angular 的依赖注入(inject)?

xml - 通过 XML 统一配置字典

java - 如何将主体检索为 JSON Play 框架 1.5