Skip to main content
 首页 » 编程设计

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

2025年05月04日92mfrbuaa

这个问题可以帮助您了解我的需求。 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 
}