在构建一个新的 Playframework 应用程序时,我正在尝试使用蛋糕模式。
我的第一个理解是将自定义特征混合到控制器中,并将 Play 提供的特征作为参数传递:
trait MyComponents {
def actorSystem: ActorSystemClassic
lazy val service = new MyService(actorSystem)
}
class MyController(
controllerComponents: ControllerComponents,
override val actorSystem: ActorSystemClassic) with MyComponents {
// ...
// Use `service` from MyComponents
}
class MyApp extends BuiltInComponentsFromContext(context) {
val controller = new MyController(
controllerComponents, // <- Provided by BuiltInComponentsFromContext
)
}
在我不得不测试MyController
并尝试模拟service
.
为了模拟,service
我应该能够使用MyComponents
将提供模拟的存根。为了提供该存根,我必须将它作为构造函数参数传递。
class MyController(
controllerComponents: ControllerComponents,
myComponents: MyComponents,
override val actorSystem: ActorSystemClassic) {
// ...
// Use `myComponents.service`
}
当然,我的控制器比这更复杂,他需要多个组件才能工作。我担心以一个难以管理的构造函数结束,并带有很多参数。
为了限制参数的数量,一种想法是将所有组件混合在一起。但是我无法ControllerComponents
将超类提供的实例BuiltInComponentsFromContext
与MyComponents
:
class MyController(components: MyComponents with ControllerComponents)
class MyApp extends BuiltInComponentsFromContext(context) {
val controller = new MyController(
new MyComponents with /*instance of controllerComponents provided by BuiltInComponentsFromContext*/
)
}
我不想传递给controllerComponents
,MyComponents
因为那个类提供业务服务,她不关心控制器组件。
你能帮我用蛋糕模式实现一个现实生活中的应用程序吗?