这个问题可以帮助您了解我的需求。 Cake pattern: one component per implementation, or one component per trait?
我有一个使用多个UserService实现的Scala应用程序,它将由组件(s?)提供。
我想知道在另一个组件中是否有办法“扫描”应用程序,以便我可以检索一组提供实现特征UserService的对象的所有组件? 这样我就可以遍历我的蛋糕构建应用程序提供的所有UserService接口?
我想我可以根据其依赖关系构建一个UserService列表的组件,但是是否可以让这个组件构建列表而不需要任何硬编码依赖?
答案 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
}