我目前正在烘烤我的第一个蛋糕图案,所以请多多包涵。
我拿了我的工作单体应用程序,并将其切割成功能层。剪切看起来很干净,但导致两个层依赖于隐式 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系统。
这不起作用,因为
ActorSystem
解决依赖关系并实例化 val 时不存在,从而导致 NPE。这看起来也很丑陋,我相信必须有一种更好/更简单的方法来处理它。使用蛋糕模式时,我应该如何处理层之间的共享隐式依赖关系,如
ActorSystem
在这种情况下?谢谢
最佳答案
自类型不是构建结 block 架构的要求,实际上我仅在特征是层的组件的情况下使用自类型。因此,当我需要在范围内放置一些隐式(例如用于 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")
}
这是一个过于简单的例子(如果你想要一个建立在蛋糕模式之上的真实系统的好例子,那么你绝对应该看看 Precog 系统,example 不同模块/层连接的地方),但不是你可以在需要时混合使用隐式 ActorSystem。
关于scala - 带有 akka : Providing implicit actorSystem to several layers 的蛋糕图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464236/