Cake模式:如何获取组件提供的UserService类型的所有对象

时间:2013-01-26 00:24:30

标签: scala cake-pattern

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

我有一个使用多个UserService实现的Scala应用程序,它将由组件(s?)提供。

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

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

1 个答案:

答案 0 :(得分:6)

您只需将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
}