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

标签 scala cake-pattern

这个问题可以帮助您了解我的需求。 Cake pattern: one component per implementation, or one component per trait?

我有一个使用多个 UserService 实现的 Scala 应用程序,这些实现将由组件提供?

我想知道在另一个组件中是否有一种方法可以“扫描”应用程序,以便我可以检索一组提供实现 Trait UserService 的对象的所有组件? 这样我就可以遍历蛋糕构建应用程序提供的所有 UserService 接口(interface)?

我想我可以有一个组件根据其依赖关系构建 UserService 列表,但是是否可以让该组件构建列表而无需任何硬编码依赖关系?

最佳答案

您可以简单地将 UserService 实例的列表直接放入 UserServiceComponent 中,并让基础 UserService 在此列表中注册自己。

trait UserServiceComponent {
  private val _userServices = collection.mutable.Buffer[UserService]()
  def userServices: Seq[UserService] = _userServices.synchronized {
    _userServices.toList // defensive copy
  }
  private def registerUserService( service: UserService ) = _userServices.synchronized {
    _userServices += service
  }

  trait UserService {
    registerUserService( this )

    def getPublicProfile(id: String): Either[Error, User]
  }

  val mainUserService: UserService
}

trait DefaultUserServiceComponent extends UserServiceComponent { self: UserRepositoryComponent =>
  protected class DefaultUserService extends UserService {
    // NOTE: no need to register the service, this is handled by the base class
    def getPublicProfile(id: String): Either[Error, User] = userRepository.getPublicProfile(id)
  }
  val mainUserService: UserService = new DefaultUserService
}

关于scala - 蛋糕图案 : how to get all objects of type UserService provided by components,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532428/

相关文章:

scala - 在什么情况下自类型注释提供扩展无法实现的行为

unit-testing - 如何在蛋糕模式中使用模拟

scala - 蛋糕图案——为什么这么复杂

scala - Spark avro 到 Parquet

scala - Akka 远程处理和 Heroku

performance - 哪些 Scala 特性性能较差

java - 如何使用 play Framework 2.0 View 创建常量

scala - 值切片不是 play.api.libs.iteratee.Enumerator 的成员

具有不同生命周期的对象的 Scala 蛋糕模式

scala - 蛋糕图案 : mixing in in a trait