0

在构建一个新的 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将超类提供的实例BuiltInComponentsFromContextMyComponents

class MyController(components: MyComponents with ControllerComponents)

class MyApp extends BuiltInComponentsFromContext(context) {
  val controller = new MyController(
     new MyComponents with /*instance of controllerComponents provided by BuiltInComponentsFromContext*/
  )
}

我不想传递给controllerComponentsMyComponents因为那个类提供业务服务,她不关心控制器组件。

你能帮我用蛋糕模式实现一个现实生活中的应用程序吗?

4

0 回答 0