我目前正在烘焙我的第一个蛋糕图案,所以请多多包涵。

我拿起了我的整体应用程序,然后将其切成功能层。剪切看起来很干净,但是导致了两个依赖于隐式ActorSystem的层。

我试图解决这种依赖关系是这样的:

trait LayerA {
  this: ActorSystemProvider =>
  private implicit val implicitActorSystem = actorSystem
  import implicitActorSystem.dispatcher // implicit execution ctx
  ...
}

...以及类似地适用于LayerX

我的汇编类如下:
class Assembly extends LayerA with LayerB with LayerX with ActorSystemProvider

其中ActorSystemProvider仅实例化actor系统。

如果解析依赖项并实例化val时生成NPE,则ActorSystem不存在,这将不起作用。这看起来也很丑陋,我相信必须有一种更好/更轻松的方式来处理它。

使用蛋糕模式时,应如何处理各层之间共享的隐式依赖关系,例如ActorSystem

谢谢

最佳答案

自身类型不是构建蛋糕式体系结构的必要条件,实际上我仅在特征是层的组成部分的情况下才使用自身类型。因此,当我需要将一些隐式对象放入范围内时(例如Spray Client的ActorRefFactory),我只需在以下位置混合一个特征:

trait ActorSystemProvider {
  implicit def actorSystem: ActorSystem
}

在最底层(即所谓的“世界尽头”),我具有以下代码结构:
trait ServiceStack
  extends SomeModule
     with SomeModule2
     with SomeModule3
     with ActorSystemProvider

object ServiceLauncher extends App with ServiceStack {
  val actorSystem = ActorSystem("ServiceName")
}

这是一个过于简化的示例(如果您想在Cake Cake之上构建真实系统的一个很好的示例,那么您绝对应该看看Precog系统,不同模块/层连接的example),但不能混合使用隐式ActorSystem当您需要时。

10-08 02:56