我目前正在烘焙我的第一个蛋糕图案,所以请多多包涵。
我拿起了我的整体应用程序,然后将其切成功能层。剪切看起来很干净,但是导致了两个依赖于隐式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当您需要时。