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

Seb*_*ber 3 scala cake-pattern

这个问题可以帮助您了解我的需求. 蛋糕模式:每个实现一个组件,或每个特性一个组件?

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

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

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

Rég*_*les 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
}
Run Code Online (Sandbox Code Playgroud)