gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:48:12 30 4
gpt4 key购买 nike

我有一个 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com