scala - 带有 akka : Providing implicit actorSystem to several layers 的蛋糕图案

标签 scala akka cake-pattern

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

我拿了我的工作单体应用程序,并将其切割成功能层。剪切看起来很干净,但导致两个层依赖于隐式 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/

相关文章:

scala - 类标签和路径相关的类型,具有蛋糕图案的味道

scala - 蛋糕图案 : how to get all objects of type UserService provided by components

scala - Scala 背后的可索引数据结构便于理解

scala - 当键是一个只有第一个元素已知的元组时,如何获取 scala Map 值?

java - 在 Scala 中使用重载的 vargs 方法覆盖 Java 接口(interface)

performance - 使用Scala/Akka在JVM中进行高频交易

scala - 具有覆盖抽象类型的蛋糕模式不适用于类型上限

scala - 为什么在这种情况下不能将函数名称作为参数传递?

scala - 使用事件处理程序配置 akka 记录器的记录器名称

scala - 在Akka中是否必须拥有大师级 Actor ?