3

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

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

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

我想我可以有一个组件根据它的依赖关系构建一个 UserService 列表,但是是否可以让这个组件在没有任何硬编码依赖关系的情况下构建列表?

4

1 回答 1

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
}
于 2013-01-26T13:42:30.817 回答